본문 바로가기
dev/JAVA

[JAVA] 다형성 / 참조변수간의 형변환

by dev_Step 2022. 5. 30.

다형성이란?

 >> 조상 타입 참조변수로 자소나입 객체를 다루는것

 객체를 생성할때 참조변수와 생성자의 타입을 동일하게 생성했었는데

                             Tv      t          =      new      Tv();

                   SmartTv      s          =     new       SmartTv();

 

다형성이란  객체간 상속 관계가 형성되어 있을때 조상타입의 참조변수 t로 

자손 타입의 객체 SmartTv()를 다루는 것이다. 

                             Tv       t           =        new       SmartTv();               (불일치 해도 OK)

 

 

 

<< 조상 타입의 멤버는 자식보다 작거나 같다. >>

SmartTv  s = new SmartTv(); 로 생성할 경우에는 

Tv의 멤버 4개와 SmartTv 멤버 2개 총 6개의 멤버를 모두 사용할 수 있다.

 

Tv t = new SmartTv();  로 생성할 경우는

Tv에는 멤버가 4개 밖에 없기 때문에 SmartTv가 6개를 가지고 있더래도 Tv에는 SmartTv에만 있는 것을

사용할 수 없기 때문에 4개 밖에 사용할 수 없다.

 

하지만 반대로  자손타입의 참조변수로 조상타입의 객체를 가리킬수 없다.

 SmartTv s  = new Tv(); -----------> 허용되지 않는다.

 

실제 가지고 있는 멤버 갯수 보다(인스턴스TV()[5])   참조변수의 멤버 갯수가 크면 안된다.(s[7]) 

즉 참조변수의 기능이 더 큰데 인스턴스가 작게 만들수 없다 --> SmartTv s = new Tv()가 안된다는 말

책 - 자바의정석

****** 참조변수가 더많은 멤버를 가지고있는 객체의 주소를 참조 하더래도 참조변수에있는 것만 사용가능하다.

왜냐하면 참조변수의 리모콘에는 해당기능을 사용할 수 있는 버튼이 없다.   ******

 

 

참조변수의 형변환

  >> 참조변수간의 형변환은 사용할 수 있는 멤버의 갯수를 조절하는 것으로.. 

  >> 조상 자손 관계의 참조변수는 서로 형변환 가능.

 

다형성에서 봤던 것처럼  

Tv t = new Tv();

SmartTv s = new SmartTv();   

t = s;               SmartTv 객체의 주소를 t에 넣어주게 되면, t에서는 모든 기능을 사용하는게 아니라 t에 있는

                       멤버변수만 사용할 수 있다. 위에 사진을 예로들자면   

                       CaptionTv의 모든 멤버를 Tv가 사용하지 못하고 Tv에 있는 5개만 사용할 수 있었다.

SmartTv ss;

ss = (SmartTv)t;             결국 s의 주소인 X100이 ss에 넣어지게 되고 ss의 경우는 모든 멤버(기능)을 사용할 수 있다.1

조상타입이 -> 자손타입으로 형변환시 형변환 생략이 불가능하다.

 

 

 

c = (Cars)f; 시에

Cars 로는 FireCar의 fullFuel() 기능과 onOff, input을 사용하지 못했다.

 

하지만

ff = (FireCar)c; 는 c에는 FireCar 의 f의 주소를 가지고 있기 때문에

ff는 모든 기능을 사용할 수 있다. ff는 FireCar의 참조변수이므로

 

즉 리모컨(참조변수) 가 가리키고 있는 실제 객체의 주소의 멤버(인스턴스의 멤버수)보다   리모컨(참조변수의 멤버수)이 가지고 있는 멤버의 갯수가 크면안된다.

 

'dev > JAVA' 카테고리의 다른 글

[JAVA] 인터페이스  (0) 2022.05.31
[JAVA] 매개변수의 다형성  (0) 2022.05.30
[JAVA] 매개변수(Parameter) , 인수(argument)  (0) 2022.05.30
[JAVA] 클래스  (0) 2022.05.30
[JAVA] 변수  (0) 2022.05.30