반응형
- 다형성 활용
일반 고객과 VIP 고객 사이의 중간 등급 만들기
GOLD 고객의 조건
- 제품을 살 때 10% 할인
- 보너스 포인트를 2% 적립
- 담당 전문 상담원 없음
결과는 다음과 같다.
package first_project;
public class GoldCustomer extends Customer{
double saleRatio;
public GoldCustomer(int customerId, String customerName) {
super(customerId, customerName);
customerGrade = "GOLD";
bonusRatio = 0.02;
saleRatio = 0.1;
}
@Override
public int calcPrice(int price) {
bonusPoint += price * bonusRatio;
return price - (int)(price*saleRatio);
}
}
- 다운 캐스팅
우리는 앞서 상위 클래스로 형 변환이 묵시적으로 이루어지는 것을 배웠다.
Animal ani = new Human();의 경우 인스턴스 Human은 Animal로 형 변환이 이루어지기 때문에
Animal 클래스에서 선언한 메서드와 멤버 변수만 사용 가능하다.
필요에 따라 다시 원래의 인스턴스형 Human형으로 돌아가 더 많은 기능을 사용할 필요가 있을 수 있다.
이렇게 상위 클래스로 형 변환 되었던 하위 클래스를 원래 자료형으로 형 변환하는 것을 다운 캐스팅이라고 한다.
- instanceof
모든 인간은 동물이지만, 모든 동물이 인간인 것은 아니다.
따라서 다운 캐스팅을 하기 전에 상위 클래스로 형 변환된 인스턴스의 원래 자료형을 확인해야 오류를 막을 수 있다.
이를 위한 예약어가 instanceof이다.
- instanof 사용법
instanceof는 왼쪽에 있는 변수의 원래 인스턴스형이 오른쪽 클래스 자료형인가를 확인한다. true or false를 반환.
Animal hAnimal = new Human();
if(hAnimal instanceof Human){ //hAnimal 인스턴스 자료형이 Human형이라면
Human human = (Human) hAnimal; //인스턴스 hAnimal을 Human형으로 다운 캐스팅
}
다운 캐스팅된 이후에는 각각의 클래스에 선언된 메서드를 호출 가능해짐.
- 사용 예시
package first_project;
class Animal{
public void move() {
System.out.println("animal moves.");
}
}
class Human extends Animal{
public void move() {
System.out.println("A man walks.");
}
public void readBook() {
System.out.println("A man read a book.");
}
}
public class AnimalTest {
public static void main(String[] args) {
Animal ani = new Human(); // 상위 클래스로 형 변환.
ani.move(); // 오버라이딩된 move가 호출됨.
if(ani instanceof Human) {
Human h = (Human) ani; // Human형으로 다운 캐스팅
h.readBook(); // 이제 Human 클래스 안의 readBook() 메서드를 실행할 수 있게 됨
}else{
System.out.println("지원되지 않는 형입니다.");
}
}
}
결과
A man walks.
A man read a book.
댓글