부모 클래스의 모든 메소드가 자식 클래스에 맞게 설계되어 있다면 가장 이상적인 상속이지만, 어떤 메소드는 자식 클래스가 사용하기에 적합하지 않을 수도 있습니다. 이 경우 상속된 일부 메소드는 자식 클래스에서 다시 수정하여 사용해야 합니다. 자바는 이런 경우를 대비하여 메소드 재정의 기능의 제공합니다.
재정의 방법
1. 부모의 메소드와 동일한 선언부(리턴 타입, 메소드 이름, 매개 변수 목록)를 가져야 합니다.
2. 접근 제한을 더 강하게 재정의할 수 없습니다.(예를 들어 public에서 private으로 변경 불가) 그러나 반대로 접근 제한을 약화시키는 것은 가능합니다.(예를 들어 default에서 protected으로)
3. 새로운 예외를 throws할 수 없습니다.
메소드가 재정의되면 부모 객체의 메소드는 숨겨지고 자식 메소드가 호출됩니다.
예를 들어 부모클래스의 메소드가 다음과 같을 때
double areaCircle(double r) {
return 3.14159 *r*r;
}
자식클래스를 다음과 같이 재정의할 수 있다.
@Override
double areaCircle(double r) {
return Math.PI*r*r;
}
이때 @Override 어노테이션은 생략해도 좋으나, 이것을 붙여주면 재정의된 메소드가 정확히 재정의된 것인지 컴파일러가 확인하기 때문에 개발자의 실수를 줄여줍니다.
+ 이클립스는 부모 메소드 중 하나를 선택해서 재정의 메소드를 자동 생성해주는 기능이 있습니다. 이 기능은 부모 메소드의 선언부(시그니처)를 정확히 모를 경우 매우 유용하게 사용할 수 있습니다.
1. 자식 클래스에서 재정의 메소드를 작성할 위치로 입력 커서를 옮깁니다.
2. [Source] - [Override/Implement Methods] 메뉴를 선택합니다.
3. 부모 클래스에서 재정의될 메소드를 선택하고 [ok] 버튼을 누릅니다.
부모 메소드 호출
자식 클래스 내부에서 재정의된 부모 클래스의 메소드를 호출해야 하는 상황이 발생한다면 명시적으로 super 키워드를 붙여서 부모 메소드를 호출할 수 있습니다.
super.부모메소드();
final과 상속
final 키워드를 class 앞에 붙이면 이 클래스는 최종적인 클래스이므로 상속할 수 없는 클래스가 됩니다. 즉 final 클래스는 부모 클래스가 될 수 없어서 자식 클래스를 만들 수 없다는 것입니다.
또한 부모 메소드 역시 최종적인 메소드이므로 재정의할 수 없습니다.
'java' 카테고리의 다른 글
추상 클래스, 추상 메소드 (0) | 2021.01.25 |
---|---|
다형성 (0) | 2021.01.25 |
상속과 super(); + this() (0) | 2021.01.24 |
java 이클립스 단축키 모음 (0) | 2021.01.24 |
Getter와 Setter 메소드 (0) | 2021.01.24 |