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();
	}

업캐스팅은 언제나 가능하며 형변환을 하지 않아도 됨.

다운캐스팅은 "업캐스팅"한 객체만 가능하고 반드시 강제캐스팅을 해야함. ★★★

+ Recent posts