메소드 오버라이딩
상위클래스에 이미 정의된 메소드의 구현 내용이 하위클래스에서 구현할 내용과 맞지 않는 경우 하위 클래스에서 동일한 이름의 메소드를 재정의 할수 있다.
예제의 Customer 클래스의 calcPrice() 와 VIPCustomer 의 calcPrice() 구현 내용은 할인율과 보너스 포인트 적립 내용 부분의 구현이 다르다
따라서 VIPCustomer클래스는 calcPrice() 메소드를 재정의 해야 한다 .
package inheritance;
import org.omg.Messaging.SyncScopeHelper;
public class Customer {
private int customerID;
private String customerName;
protected String customerGrade;
int bonusPoint;
double bonusRatio;
public Customer(int customerID , String customerName) {
this.customerID = customerID;
this.customerName = customerName;
customerGrade = "SILVER";
bonusPoint = 1000;
}
// 가격 클래스 입니다.
public int calcPrice(int price) {
bonusPoint += price * bonusPoint;
return price;
}
Customer 를 상속 하는 VIPCustomer 클래스에서
CalcPrice 메소드를 재정의 합니다. ( 오버라이딩 )
package inheritance;
public class VIPCustomer extends Customer {
double salesRatio;
private int agentID;
public VIPCustomer(int customerID, String customerName) {
super(customerID, customerName);
customerGrade = "VIP";
bonusRatio = 0.05; // 5프로
salesRatio = 0.1; // 10프로
}
// 상위클래스의 메소드를 재정의(오버라이딩) 할수 있다. 이미 구현된 코드를 내가 재구현
@Override // 에너테이션 표시 , 컴파일러에게 재정의된 메서드라는 정보를 제공한다.
public int calcPrice(int price) { // 메소드명과 매개변수도 같아야 한다.
bonusPoint += price * bonusRatio;
return price - (int)(price * salesRatio); // 할인된 가격을 반환을 했다 - 오버라이딩
}
}
Customer customerpark = new VIPCustomer(10020,"세종대왕"); 업캐스팅
타입은 상위클래스 생성자는 하위클래스
하게되면 참조변수로 calcPrice 는 타입이 Customer 타입만 보이는데
오버라이딩 메소드를 부르게 된다. 즉 생성된 인스턴스가 불리게된다.
왜?
가상메모드라 불리는데 가상 함수 테이블에 어드레스 주소가 매핑이 되기 때문이다.
package inheritance;
public class OverridingTest {
public static void main(String[] args) {
Customer customerLee = new Customer(10010, "이순신");
customerLee.bonusPoint = 1000;
VIPCustomer customerKim = new VIPCustomer(10020,"김유신");
customerKim.bonusPoint = 10000;
int priceLee = customerLee.calcPrice(10000);
int priceKim = customerKim.calcPrice(10000);
System.out.println(customerKim.showCustomerInfo() + "지불 금액은" + priceLee + " 원 입니다.");
System.out.println(customerLee.showCustomerInfo() + "지불 금액은" + priceKim + " 원 입니다.");
// 업캐스팅을 하게 되면 과연 메소드는 어떤게 호출이 될까? 결국 오버라이딩된 메소드가 부르게 된다. 생성된 인스턴스가 불리게된다. = 가상 메소드 라고 부른다
// 왜? 가상함수 테이블에 어드레스 주소가 매핑이되기 떄문이다.
Customer customerpark = new VIPCustomer(10020,"세종대왕");
int pricepark = customerpark.calcPrice(10000); // 타입이 Customer 타입만 보이는데 ...
System.out.println(customerpark.showCustomerInfo() + "지불 금액은" + pricepark + " 원 입니다.");
}
}
'JAVA Programming' 카테고리의 다른 글
[37] 다운캐스팅 과 instanceof (0) | 2020.07.16 |
---|---|
[36] 다형성 (Polymorphism) 이란 ? (0) | 2020.07.15 |
[34] 상속에서의 묵시적 형변환 ( 업캐스팅 ) (0) | 2020.07.15 |
[33] 상속에서의 super() 상위 부모 생성자 호출 (0) | 2020.07.15 |
[32] 상속 , 다형성 이란 ? (0) | 2020.07.15 |