참조변수의 형변환

참조변수의 형변환

클래스 3개가 있다고 하자. Gp(할아버지), P(아버지), C(자식)가 있다. 여기서 GP를 P가 상속받고, P를 C가 상속받았다고 하자.

함수의 기능은 다음과 같다고 해보자.

Gp{ “할아버지”를 출력하는 메서드; }

P{ “아버지”를 출력하는 메서드; }

C{ “자식”을 출력하는 메서드; }

이때 Gp gp = new gp(); 하고 클래스 Gp에서 출력하는 메서드를 쓴다면 당연히 “할아버지”가 출력된다.

P p = new p(); 하고 클래스 P에서 출력한다면 “아버지”가 출력된다.

C c = new c(); 하고 클래스 C에서 출력한다면 “자식”이 출력된다.

그러나 여기서, 자식은 부모집에 들어갈 수 있다. (상속받은 클래스는 부모 클래스 안에 들어갈 수 있다)

예컨대,

gp=p; //할아버지에 아버지 대입  (Gp gp=new p();)

p=c; //아버지에 자식 대입          (P p=new c();)

gp=c; //할아버지에 자식 대입     (GP gp=new c();)

이 가능하다. (반대로 p=gp; c=p; c=gp 는 불가능하다.)

만약 gp=p; 해서 클래스 Gp에서 출력하는 메서드를 쓴다면 “아버지”가 출력된다. gp에 p가 들어왔기 때문이다. 다시 말해, gp의 메서드를 p가 덮어썼다.

이것은 변수 a=1; 을 써놓고, a=2;라고 쓴 후 a를 출력하면 2가 나오는 원리와 똑같다. 원래 클래스 Gp에는 <“할아버지” 출력메서드>가 들어있었으나 클래스 p를 대입했으므로 p의 클래스들이 Gp 안에 들어갔기 때문이다.

아래는 전부 같은 원리로 작동한다.

gp=p; 한다면 Gp에서 출력하면 “아버지”가 출력,

p=c; 한다면 P에서 출력하면 “자식”이 출력,

gp=c; 한다면 Gp에서 출력하면 “자식”이 출력된다.