상위클래스에서 정의한 메서드가 하위 클래스에서 구현할 내용과 맞지 않을 경우에 하위클래스에서 이 메서드를 재정의할 수 있다.
즉. 하위 클래스에서 매서드를 재정의하는 것을 '메서드 오버라이딩'이라고 한다.
오버라이딩 조건 : 반환형, 메서드 이름, 매개변수 개수, 매개변수 자료형이 반드시 같아야한다.
public class Customer {
...
int bonusPoint;
double bonusRaio;
...
public int calcPrice(int Price) {
bonusPoint += price * bonusRatio;
return price;
}
...
}
public class VIPCustomer extends Customer {
...
double saleRatio;
...
public int calcPrice(int price) {
bonusPoint += price * bonusRatio;
return price - (int)(price * saleRatio);
}
...
}
위 코드를 보면 상위 클래스 Customer에 있는 calcPrice()를 하위 클래스 VIPCustomer에서 재정의 했고,
상위클래스의 calcPrice() 메서드와 매개변수의 자료형 및 개수가 같고 반환형도 int형으로 같다.
Customer vs = new VIPCustomer();
vc.calcPrice(10000); 같은 경우는 어떻게 될까?
묵시적 형 변환에 의해 VIPCustomer가 Customer 형으로 변환되었다. 그리고 calcPrice가 호출되었는데,
calcPrice()는 하위클래스에서 재정의된 메서드이며 Customer 클래스와 VIPCustomer 클래스에 모두 존재한다.
그렇다면 vc.calcPrice(10000)은 어떤 클래스의 메서드를 호출할까?
public class Overriding {
public static void main(String[ ] args) {
Customer vc = new VIPCustomer(10000,"홍길동",2000);
bonusPoint = 1000;
System.out.println(vc.calcPrice(10000));
}
}
모든 클래스의 코드들을 다 적으면 너무 길어지기 때문에 중략했는데,
상위 클래스의 calcPrice()가 호출되면 10000, 하위클래스의 calcPrice()가 호출되면 9000이 출력될 것이고
출력화면은 9000이 출력되었다.
결론은 재정의된 메서드가 호출된다.
상속에서 상위클래스와 하위클래스에 같은 이름의 메서드가 존재할 때 호출되는 메서드는
인스턴스에 따라 결정된다.
다시 말해, 선언한 클래스형이 아닌 생성된 인스턴스의 메서드를 호출하는 것이다.
'자바 기초' 카테고리의 다른 글
자바 추상클래스 - Do it! 자바프로그래밍기초 (0) | 2022.07.22 |
---|---|
자바 다형성 -Do it! 자바프로그래밍기초 (0) | 2022.07.22 |
자바 상속에서 클래스 생성, super - Do it! 자바프로그래밍기초 (0) | 2022.07.20 |
자바 상속 - Do it! 자바프로그래밍 기초 (0) | 2022.07.20 |
자바 ArrayList - Do it! 자바프로그래밍기초 (0) | 2022.07.20 |