프로그래밍/JAVA
[ JAVA ] 오버라이딩(overriding)
dev-je22
2022. 10. 9. 03:40
1. 오버라이딩이란?
- override의 사전적 의미는 '~위에 덮에쓰다(overwrite)'으로 조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것을 말한다.
- 상속받은 메서드를 자손 클래스 자신에 맞게 변경해야하는 경우 조상의 메서드를 오버라이딩한다.
2. 오버라이딩의 조건
자손 클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와
① 이름이 같아야 한다.
② 매개변수가 같아야 한다.
③ 반환타입이 같아야 한다.
즉, 선언부가 서로 일치해야 한다.
✔ 접근 제어자(access modifier)와 예외(exception)는 제한된 조건 하에서만 다르게 변경할 수 있다.
1️⃣ 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경 할 수 없다.
- 만약 조상 클래스에 정의된 메서드의 접근 제어자가 protected라면, 이를 오버라이딩하는 자손 클래스의 메서드는 접근 제어자가 protected나 public이어야 한다.
- 대부분의 경우 같은 범위의 접근 제어자를 사용한다.
※ 접근 제어자의 접근범위
public > protected > (default) > private
2️⃣ 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.
3️⃣ 인스턴스메서드를 static메서드로 또는 그 반대로 변경할 수 없다.
- 조상 클래스에 정의된 static메서들르 자손 클래스에서 똑같은 이름의 static메서드로 정의할 수 있지만
이것은 각 클래스에 별개의 static메서드를 정의한 것일 뿐 오버라이딩은 아니다.
3. 오버로딩 vs 오버라이딩
◼ 오버로딩(overloading) : 기존에 없는 새로운 메서드를 정의하는 것(new)
◼ 오버라이딩(overriding) : 상속받은 메서드의 내용을 변경하는 것(change, modify)
예시)
4. super
> 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수이다.
> 조상 클래스 멤버 변수와 자손 클래스 멤버 변수는 같은 이름으로 정의하는 것이 가능하며 참조변수 super를 이용해서 서로 구별할 수 있다.
> static메서드(클래식 메서드)는 인스턴스와 관련이 없으므로 this와 마찬가지로 super도 static 메서드에서는 사용할 수 없고 인스턴스 메서드에서만 사용할 수 있다.
> 메서드도 super를 써서 호출할 수 있으며, 특히 조상 클래스의 메서드를 자손 클래스에서 오버라이딩한 경우에 super를 사용한다.
예시)
5. super() - 조상 클래스의 생성자
- super()는 조상 클래스의 생성자를 호출하는데 사용된다.
- Object클래스를 제외한 모든 클래스의 생성자 첫 줄에 생성자, this() 또는 super(),를 호출해야한다.
그렇지 않으면 컴파일러가 자동적으로 'super();'를 생성자의 첫줄에 삽입한다.
❓ 생성자의 첫 줄에서 조상클래스의 생성자를 호출해야하는 이유
> 자손 클래스의 멤버가 조상 클래스의 멤버를 사용할 수도 있으므로 조상의 멤버들이 먼저 초기화되어
있어야 하기 때문
※ 인스턴스를 생성할 때 고려할 점
① 클래스 - 어떤 클래스의 인스턴스를 생성할 것인가?
② 생성자 - 선택한 클래스의 어떤 생성자를 이용해서 인스턴스를 생성할 것인가?
예시1)
예시2)
◼ 생성자의 호출 순서
Point3D() > Point3D(int x, int y, int z) > Point(int x, int y) > Object()