본문 바로가기

Java

다형성(polymorphism)

출처 - 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에 저장
    }
}