출처 - Java의 정석 기초편 (남궁 성)
1. 다형성
- 조상 타입 참조변수로 자손 타입 인스턴스 다루는 것
- 참조변수 타입에 따라 사용할 수 있는 인스턴스 멤버 개수 달라짐
SmartTv s = new SmartTv(); // 참조변수와 인스턴스의 타입이 일치 (일반적)
Tv t = new SmartTv(); // 조상 타입 참조변수로 자손 타입 인스턴스 참조 (다형성)
SmartTv s = new Tv(); // 에러, 허용 안 됨
2. 참조변수 형변환
- 상속 관계의 참조변수는 서로 형변환 가능
- 사용할 수 있는 멤버 개수를 조절하는 것(리모콘 변경될 뿐 변수에 저장된 주소값 변경되지 않음)
- 조상 타입으로 형변환은 다룰 수 있는 멤버 개수가 줄어드므로 형변환 생략 가능(항상 안전)
class Car {}
class FireEngine extends Car {}
class Ambulance extends Car {}
FireEngine f = new FireEngine();
Car c = (Car)f; // 조상 Car 타입으로 형변환 (생략가능)
FireEngine f2 = (FireEngine)c; // 자손 FireEngine 타입으로 형변환 (생략불가)
A0mbulance a = (Ambulance)f; // 상속관계가 아닌 클래스 간 형변환 불가
3. instanceof 연산자
- 참조변수 형변환 가능여부 확인하고 형변환 해야 함
- 참조변수 instanceof 타입(클래스명), 연산의 결과로 true 또는 false 반환
void doWork(Car c) {
if (c instanceof FireEngine) {
FireEngine fe = (FireEnfine)c;
}
}
4. 다형성 장점
① 다형적 매개변수
- 참조형 매개변수는 메서드 호출시 자신과 같은 타입 또는 자손 타입 인스턴스를 넘겨줄 수 있음
- 참조변수+문자열 = 참조변수.toString()+문자열
void buy(Product p) { // Product클래스 자손 타입 참조변수면 매개변수로 가능
money -= p.price;
bonusPoint += p.bonusPoint;
System.out.println(p + "을/를 구입하셨습니다."); // p = p.toString()
}
② 하나의 배열에 여러종류 객체 저장
- 조상 타입 참조변수 배열로 공통 조상을 가진 다른 종류 객체를 배열로 묶을 수 있음
- Vector클래스(Object elementData[]): 모든 종류의 객체 저장 가능(동적으로 크기가 관리되는 객체배열)
class Buyer {
Product[] cart = new Product[10]; // 구입한 제품을 저장하기 위한 배열(카트)
int i = 0; // Product배열 cart에 사용될 index
void buy(Product p) {
cart[i++] = p; // 제품을 Product[] cart에 저장
}
}
'Java' 카테고리의 다른 글
내부 클래스(inner class), 익명 클래스(anonymous class) (0) | 2022.10.04 |
---|---|
추상 클래스(abstract class), 인터페이스(interface) (1) | 2022.10.03 |
제어자(modifier) (0) | 2022.09.30 |
super, super(), package, import문 (1) | 2022.09.30 |
상속, 포함, Object클래스, 오버라이딩 (0) | 2022.09.28 |