Language/Java

4.6 객체 지향 프로그래밍 (다형성)

리져니 2021. 7. 9. 22:02

다형성

여러 가지 형태를 가질 수 있는 능력.

조상 클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 함.

class Tv {
	boolean power;
    int channel;
    
    void power(){power = !power};
    void channelUp(){++channel};
    void channelDown(){--channel};
}

class CaptionTv extends Tv{
	String text;
    void caption(){};
}

 

참조형변수의 형변환

서로 상속관계에 있는 클래스 사이에서만 가능

인스턴스 타입과 참조변수의 타입이 일치하는 것이 보통이지만, 클래스가 서로 상속관계에 있을 경우,

조상 클래스 타입의 참조변수로 자손 클래스의 인스턴스를 참조하도록 하는것이 가능하다.

Tv t = new CaptionTv();

- 그러나, 참조 변수 t로는 CaptionTv 인스턴스의 모든 멤버를 사용할수 없고 Tv클래스의 멤버들만 사용할 수 있다.

- 반대의 경우인 Caption c = new Tv();는 불가능함,  Caption클래스가 Tv클래스 보다 멤버가 많기 때문(상속)

Caption c = new Caption();

Tv t = c;		// up-casting
c = (Caption) t;	// down-casting

그러나 Up-casting된 객체를 Down-casting 하는 것은 가능

 

형변환 생략

Tv t = new Tv();
Caption c = new Caption();

t = (Tv) c; 		// 형변환 생략 가능 (t = c 가능)
c = (Caption) t;	// 형변환 생략 불가능  (c = t 불가능)

* 캐스트 연산자를 사용하여 괄호안에 변환하고자 하는 타입의 이름(클래스명)을 적어주는 방식으로도 형변환 가능.

 

형변환은 참조변수의 타입을 변환하는 것이지, 인스턴스를 변환하는 것은 아니기 때문에 참조변수의 형변환은 인스턴스에 아무런 영향을 미치지 않는다.

단지 참조변수의 형변환을 통해서, 참조하고 있는 인스턴스에서 사용할 수 있는 멤버의 범위(개수)를 조절하는 것이다.

 

형변환 사용이유

 

 

 

 

instanceof 연산자

참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 사용

if (c instanceof t){
	Tv t = (tv)c;
    t.power();
}

* 연산 결과로 true를 얻은 것은 참조변수가 검사한 타입(클래스)로 형변환이 가능 하다는 것을 뜻함.

 

매개변수의 다형성

메서드의 매개변수 타입을 조상 클래스로 한다면, 메서드의 매개변수로 자손타입의 참조변수가 오는 것을 받아들일 수 있다.

void buy(Product p){
	money -= p.price;
    bounusPoint += p.bounusPoint;
}

Buyer b = new Buyer();
Tv t = new Tv();
Computer c = new Computer();
b.buy(t);
b.buy(c);

 

728x90