상위 클래스에서 정의된 method의 내용을 하위 클래스에서 동일한 이름으로 method를 재정의 하는 것을 의미한다.
ex) VIP고객들의 요금계산을 하는 매서드인 calcPrice()는 상위 클래스인 일반 클래스의 calcPrice() 매서드와 맞지 않아 재정의가 필요하다.
@Override
public int calcPrice(int price) {
bonusPoint += price * bonusRatio;
return price - (int)(price * salesRatio);
}
annotation
- 위의 코드의 @overriding과 같은 것을 의미하며 컴파일러에게 특별한 정보를 제공해주는 역할을 한다.
※ @overriding 애노테이션은 재정의 된 메서드라는 의미로 선언부가 기존의 메서드와 다른 경우 에러가 난다.
Customer customer2 = new VIPCustomer(10020, "김유신");
customer2.bonusPoint = 10000;
price = customer2.calcPrice(1000);
System.out.println(customer2.showCustomerInfo() + price);
Customer customer2 = new VIPCustomer(10020, "김유신");는 변수의 타입은 Customer이지만 인스턴스의 타입은 VIPCustomer이다. 이와같이 형변환을 하면 상위 클레스의 변수와 메서드에만 접근이 가능하지만 결과는 1000이 아닌 900이 나온다.
이러한 결과가 나오는 이유는 메서드의 이름들은 코드영역의 주소값을 나타내는데 메서드를 재정의(Overriding)을 하는 경우 메서드의 이름이 가르키는 주소영역은 재정의된 메서드의 주소를 가르키기 때문에 이러한 결과가 나온다.
※ 자바의 모든 메서드는 가상 메서드(virtual method) 이다.
※ 형변환을 하는데 메서드의 overriding을 하는 경우 해당 메서드는 재정의한 하위 클래스의 메서드로 실행된다!!!