2014년 1월 5일 일요일

[7-15] 형변환으로 올바른 것은?

[7-15] 형변환으로 올바른 것은?

class Unit { }
class AirUnit extends Unit { }
class GroundUnit extends Unit { }
class Tank extends GroundUnit { }
class AirCraft extends AirUnit { }

Unit u = new GroundUnit ();
Tank t = new Tank();
AirCraft ac = new AirCraft();

a. u = (Unit)ac;

b. u = ac; //  AirCraft 는 Unit의 자손이르로 업캐스팅되어 Unit 형태의 u 가 참조할 수 있다.

c. GroundUnit gu = (GroundUnit)u;
// u 는 실제 GroundUnit() 인스턴스를 참조하고 있으므로, 
   다운캐스팅하고 같은 GroundUnit 형태인 gu가 참조할 수 있다.

d. AirUnit au = ac; // 업캐스팅 이므로 형변환 연산자 생략 (AirUnit)ac

e. t = (Tank)u; // 조상타입의 인스턴스를 자손타입으로 형변환 할 수 없다.
// 다르게 말하면, 자손 인스턴스가 조상 인스턴스를 참조할 수 없다.

f. GroundUnit gu = t; // t 가 잠조하고 있는 Tank()는 GroundUnit의 자손이므로,                                                  GroundUnit 형태의 gu가 업캐스팅된 t를 참조한다.  (GroundUnit) 

/*
(자손 --> 조상)(업캐스팅) 은 생략이 가능하다. (원래 가지고 있는 형보다 높아지는것)

형변환에서  '=' 의 좌,우가 중요하다.!!!!!!!!!!!!!!!\

'=' 을 기준으로 왼쪽의 것은 '자료형'을 봐야하고, 오른쪽은 실제 '참조'하고 
있는 인스턴스를 봐야한다.

* 업캐스팅의 경우에는 조상 클래스의 멤버가 자손 클래스의 멤버보다 적을것이 분명하므로 형변환연산자가 생략이 가능하지만, 다운캐스팅의 경우에는, 멤버의 수가 더 많아질 가능성이 충분하기 때문에 생략할 수 없다. // 참조변수의 형변환을 통해서, 참조하고 있는 인스턴스에서 사용할 수 있는 멤버의 범위(개수)를 조절하는 것뿐이다.
*/
/*
다운캐스팅이 헷갈려서 다른 예제

Car car = null;
FireEngine fe2 = null;

fe2 = (FireEngine)car; // 자손타입 <-- 조상타입
*/

댓글 없음:

댓글 쓰기