어떤 부모 클래스는 자식 클래스가 사용하기에 적합하지 않을 수 있다.
이 경우 상속된 일부 메소드는 자식클래스에서 다시 수정 할 수 있다.
=메소드 재정의 = overriding
-메소드가 재정의되었다면 부모 객체의 메소드는 숨겨진다.
자식 객체에서 메소드를 호출하면 재정의된 자식 메소드가 호출된다.
class Parent {
①void method1(){}
②void method2(){}
}
class Cild extends Parent {
@Overrid
③method2(){ 재정의된 메소드 }
}
class ChileExample{
public static void main(String[] args){
child.method1(); =>①호출
child.mehtod2(); =>③호출 ②는 숨겨짐
}
}
메소드 재정의 규칙
1. 부모의 메소드와 동일한 시그너처
(리턴 타입, 메소드 이름, 매개 변수 목록)를 가져야 한다.
2. 접근 제한을 더 강하게 재정의 할 수 없다. 반대는 가능.
public -> default/private(X)
default -> default/public(O)
3. 새로운 예외를 throw 할 수 없다. (10장에서 공부)
이클립스의 재정의 메소드 자동생성
1. 자식 클래스에서 재정의 메소드를 작성할 위치로 입력 커서를 옮김
2. [Source] - [Override/Implement Methods] 메뉴를 선택
3. 부모 클래스에서 재정의될 메소드를 선택하고 OK
예시
public class Calculator {
double areaCircle(double r) {
System.out.println("Calculator 객체의 areaCircle() 실행");
return 3.14159 * r * r;
//3.14159는 정밀한 계산을 위해 오버라이드 할 것임
}
}
//자식클래스
public class Computer extends Calculator{
@Override //메소드 재정의인지 컴파일러가 확인시켜줌
double areaCircle(double r) {
System.out.println("3.14...-> PI로 재정의한 Computer객체의 areaCircle() 실행");
return Math.PI * r * r;
}
}
public class ComputerExample {
public static void main(String[] args) {
int r = 10;
Calculator c = new Calculator(); //부모클래스 객체생성(3.14...)
System.out.println("원면적: " + c.areaCircle(r));
System.out.println();
Computer pi = new Computer(); //자식클래스 객체 생성(PI)
System.out.println("원면적: " + pi.areaCircle(r));
//재정의된 메소드를 호출한다.
}
}
실행결과:
Calculator 객체의 areaCircle() 실행
원면적: 314.159
3.14...-> PI로 재정의한 Computer객체의 areaCircle() 실행
원면적: 314.1592653589793