오버라이딩 (Overriding)
- 하위 클래스는 상위 클래스의 메서드를 그대로 사용할 수 있지만, 재정의하여 사용할 수도 있다.
- 오버로딩과 달리 메서드의 이름, 반환 타입, 매개 변수 등 정의부는 일치해야 한다.
멤버십 클래스 구현하기 ← 오버라이딩을 활용해 VIP 고객은 가격을 할인해주는 기능을 구현해보자
VIPCustomer.java
calcPrice 상속받아 재정의
@Override
public int calcPrice(int price) {
bonusPoint += price * bonusRatio;
price = (int)(price * (1 - salesRatio));
return price;
}
CustomerTest.java
각 인스턴스 생성하고 calcPrice(1000) 수행
Customer customerLee = new Customer("이순신",1000);
System.out.println(customerLee.calcPrice(1000)); // 1000
VIPCustomer customerKim = new VIPCustomer("김유신",10000);
System.out.println(customerKim.calcPrice(1000)); // 900
형변환 된 vc의 경우에는?
calcPrice는 Customer, VIPCustomer 두 클래스에 모두 존재하는데, 형변환 된 인스턴스의 calcPrice 메서드를 호출하면 어느 쪽의 메서드가 호출될까?
Customer vc = new VIPCustomer("Sue",15000);
System.out.println(vc.calcPrice(1000)); // 900
- vc 변수의 타입은 Customer지만 인스턴스의 타입은 VIPCustomer이다.
- 자바에서는 인스턴스의 메서드를 호출해준다. (가상 메서드의 원리)
- 자바의 모든 메서드는 가상 메서드이다.
Annotation
- 컴파일러에게 정보 제공해주는 역할
- 없어도 문법적 오류는 나지 않음
- @Override 애노테이션을 명시해주면 선언부가 상위의 메서드와 다른 경우 오류 발생
'Java & Kotlin' 카테고리의 다른 글
| [Java 객체지향] 메서드의 재정의와 가상 메서드 원리 (0) | 2022.01.31 |
|---|---|
| [Java 객체지향] 상속에서 클래스의 생성과정과 형변환 (0) | 2022.01.30 |
| [Java 객체지향] 상속 활용 (멤버십 클래스 구현) (0) | 2022.01.30 |