다형성
- 다형성: 하나의 객체가 여러 가지 형태를 가질 수 있는 성질, 한 타입의 참조변수를 통해 여러 타입의 객체를 참조할 수 있도록 만든 것 (상위 클래스 타입의 참조변수를 통해서 하위 클래스의 객체를 참조할 수 있도록 허용한 것)
참조 변수의 타입 변환
- 참조 변수의 타입 변환: 사용할 수 있는 멤버의 개수를 조절하는 것
- 세 가지 조건을 충족해야 함
1. 서로 상속관계에 있는 상위 클래스 - 하위 클래스 사이에만 타입 변환이 가능함
2. 하위 클래스 타입에서 상위 클래스 타입으로의 타입 변환(업캐스팅)은 형변환 연산자(괄호)를 생략할 수 있음
3. 반대로 상위 클래스에서 하위 클래스 타입으로 변환(다운캐스팅)은 형변환 연산자(괄호)를 반드시 명시해야함
- 다운캐스팅은 업캐스팅이 되어있는 참조변수에 한해서만 가능함
instanceof 연산자
instaceof
연산자: 캐스팅이 가능한지 여부를 boolean
타입으로 확인할 수 있는 자바의 문법요소
참조_변수 instanceof 타입
을 입력했을 때 리턴 값이 true
가 나오면 참조 변수가 검사한 타입으로 타입 변환이 가능하며, 반대로 false
가 나오는 경우에는 타입 변환이 불가능. 참조 변수가 null
인 경우에는 false
를 반환
다형성의 활용 예제
public class PolymorphismEx {
public static void main(String[] args) {
Customer customer = new Customer();
customer.buyCoffee(new Americano());
customer.buyCoffee(new CaffeLatte());
System.out.println("현재 잔액은 " + customer.money + "원 입니다.");
}
}
class Coffee {
int price;
public Coffee(int price) {
this.price = price;
}
}
class Americano extends Coffee {
public Americano() {
super(4000); // 상위 클래스 Coffee의 생성자를 호출
}
public String toString() {return "아메리카노";}; //Object클래스 toString()메서드 오버라이딩
};
class CaffeLatte extends Coffee {
public CaffeLatte() {
super(5000);
}
public String toString() {return "카페라떼";};
};
class Customer {
int money = 50000;
void buyCoffee(Coffee coffee) {
if (money < coffee.price) { // 물건 가격보다 돈이 없는 경우
System.out.println("잔액이 부족합니다.");
return;
}
money = money - coffee.price; // 가진 돈 - 커피 가격
System.out.println(coffee + "를 구입했습니다.");
}
}
// 출력값
아메리카노를 구입했습니다.
카페라떼를 구입했습니다.
현재 잔액은 41000원 입니다.