본문 바로가기

자바 기초

자바 메서드 오버라이딩, 클래스 형 변환 - Do it ! 자바프로그래밍기초

상위클래스에서 정의한 메서드가 하위 클래스에서 구현할 내용과 맞지 않을 경우에 하위클래스에서 이 메서드를 재정의할 수 있다.

즉. 하위 클래스에서 매서드를 재정의하는 것을 '메서드 오버라이딩'이라고 한다.

 

오버라이딩 조건 : 반환형, 메서드 이름, 매개변수 개수, 매개변수 자료형이 반드시 같아야한다.

 

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이 출력되었다.

 

결론은 재정의된 메서드가 호출된다.

상속에서 상위클래스와 하위클래스에 같은 이름의 메서드가 존재할 때 호출되는 메서드는 

인스턴스에 따라 결정된다.

다시 말해, 선언한 클래스형이 아닌 생성된 인스턴스의 메서드를 호출하는 것이다.