부모 클래스에서 상속된 메소드를 자식 클래스에서 변경해서 사용하는 것.
메소드가 오버라이딩되었다면 부모 객체의 메소드는 숨겨지기 때문에, 자식 객체에서 메소드를 호출하면 오버라이딩된 자식 메소드가 호출된다.
메소드 오버라이딩에는 규칙이 있다.
- 부모 메소드와 동일한 리턴 타입, 메소드 이름, 매개변수 리스트를 가져야 한다.
- 접근제한을 부모 메소드보다 강하게 바꿀 수 없다.
- 새로운 예외를 throws할 수 없다.
오버라이딩에 대해 예시를 보자.
// Calculator.java
public class Calculator {
double areaCircle(double r) {
return 3.14 * r * r;
}
}
// Computer.java
public class Computer extends Calculator {
@Override // 오버라이딩이 제대로 된것인지 컴파일러가 체크해준다.
double areaCircle(double r) {
return Math.PI * r * r;
}
}
public class CircleExam {
public static void main(String[] args) {
int r = 10;
Calculator calc = new Calculator();
System.out.println(calc.areaCircle(r)); // 314.000
Computer com = new Computer();
System.out.println(com.areaCircle(r)); // 314.1592653589793
}
}
자식 클래스에서 부모 메소드를 상속 받았지만 재정의 했기 때문에 자식 객체로 호출한 메소드는 재정의된 결과를 리턴 받는다.
부모 메소드 호출
자식 클래스에서 부모 메소드를 재정의하고 나서, 부모 메소드가 필요한 상황이 생기면 super를 붙여서 부모 메소드를 호출 할 수 있다. super는 부모 객체를 참조하고 있다.
// Airplane.java
public class Airplane {
public void fly() {
System.out.println("일반 비행 중");
}
}
// SupersonicAirplane.java
public class SupersonicAirplane extends Airplane {
public static final int NORMAL = 1;
public static final int SUPERSONIC = 2;
public int flyMode = NORMAL;
@Override // 부모 메소드를 자식 클래스에서 재정의
public void fly() {
if(flyMode == SUPERSONIC){
System.out.println("초음속 비행중");
} else {
// Airplane 클래스의 fly() 메소드 호출
super.fly();
}
}
}
// Flying.java
public class Flying {
public static void main(String[] args) {
SupersonicAirplane sa = new SupersonicAirplane();
sa.fly(); // 일반 비행 중
sa.flyMode = SupersonicAirplane.SUPERSONIC;
sa.fly(); // 초음속 비행중
sa.flyMode = SupersonicAirplane.NORMAL;
sa.fly(); // 일반 비행 중
}
}