package ex0723;
public class Ex03_ClassTypeCast {
public static void main(String[] args) {
Test3 t = new Test3();
t.print(); // a:10, b:20
// System.out.println(t.c); 컴오류. 하위클래스 멤버는 접근불가
System.out.println();
// 클래스는 상속관계가 아니면 어떠한 경우에도 형변환이 불가능하다.
// Integer 와 Long은 형변환이 불가능하다.(형제관계에서는 불가)
// Test3(부) > Sample3(자) 상하관계
// up-casting : 상위 클래스의 객체가 하위 클래스의 객체를 참조하는 것
// up-casting은 언제나 가능하며 형변환을 하지 않아도 된다.
Sample3 s1 = new Sample3(); // Test3도 메모리 할당을 받음.상위 클래스 메모리할당이 안돼면 자식도 생성불가
Test3 t1 = s1; // 프로그램 실행 시점에 s1을 t1에 줌.
System.out.println(t1 == s1); // true. 참조하는 영역이 동일하므로 동일한 객체임
System.out.println(s1.b); // 100
System.out.println(t1.b); // 20. 업캐스팅 객체라 할지라도 필드는 자기 자신것을 나타낸다.
// System.out.println(t1.c); 컴파일 오류 Test3에 c라는 필드가 없으므로. 컴파일단계에서는 x
// 업캐스팅 객체에서 재정의된 메소드는 숨어버리기 때문에 메소드는 하위 클래스의 메소드가 호출된다.
// 이곳에서 Test3 클래스의 print() 메소드를 호출할 수 있는 방법은 없다.
t1.print();
System.out.println();
t1.disp();
// t1 객체가 업캐스팅 객체라 할지라도 Test3클래스에 write() 메소드가 존재하지 않기 때문에 컴파일 오류
// t1.write();
// down-casting up casting한 객체를 다시 원래 객체로 캐스팅하는 것
// down-casting은 up casting한 객체만 가능하다.
// down-casting은 반드시 강제 캐스팅을 해야 한다.
Sample3 s2 = (Sample3) t1; // down-casting
System.out.println(s2.c);
}
}
class Test3 {
int a = 10;
int b = 20;
public void print() {
System.out.println(a+":"+b);
}
public void disp() {
System.out.println("disp...");
}
}
class Sample3 extends Test3 {
int b=100;
int c=200;
@Override
public void print() {
System.out.println("a:"+a+", b:"+b+", super.b:"+super.b+", c:"+c);
}
public void write() {
print();
super.print();
disp();
}
업캐스팅은 언제나 가능하며 형변환을 하지 않아도 됨.
다운캐스팅은 "업캐스팅"한 객체만 가능하고 반드시 강제캐스팅을 해야함. ★★★
'쌍용강북교육센터 > 7월' 카테고리의 다른 글
0723_Ex05_ClassTypeCast : 클래스 타입 캐스트 (0) | 2021.07.23 |
---|---|
0723_Ex04_ClassTypeCast (0) | 2021.07.23 |
0723_Ex02_override : 재정의 (0) | 2021.07.23 |
0723_Ex01_override (0) | 2021.07.23 |
0722_Ex06_override : 오버라이드 상속 재정의 (0) | 2021.07.22 |