package ex0723;

public class Ex04_ClassTypeCast {
	public static void main(String[] args) {
		Test4 t1 = new Test4();
		Sample4 s1 = new Sample4();
		
		System.out.println(t1.b+", "+s1.b);
		
		t1.print(); // Test4의 print() 호출
		
		// up-casting
		Test4 t2 = new Sample4();
		Test4 t3 = s1;
		Object o = new Sample4();
		
		System.out.println(t2.b); // 20, 필드는 무조건 자기 것
		// System.out.println(t3.c); 컴파일 오류. Test4클래스에 c 필드가 없으므로
		System.out.println( ((Sample4)t3).c ); // 200, 다운캐스팅
		// System.out.println (Sample4)t3.c ); // 컴오류. 연산자 우선순위가 . 이 높음.
		System.out.println( ((Sample4)o).c ); // 200, 다운캐스팅
		
		t2.print(); // 메소드는 재정의된 하위 클래스 메소드 호출(상위 메소드는 숨는다.)
		//t2.write(); // 컴파일오류. Test4에 없는 메소드 이므로.
		((Sample4)t2).write(); // 다운 캐스팅
		
		// down-casting
		// Sample4 s2 = (Sample4) t1; 런타임오류(ClassCastException) up한 것만 down가능
		if(t1 instanceof Sample4) { // instanceof 연산자 : 객체가 해당 클래스의 객체인지를 확인
			Sample4 s2 = (Sample4) t1;
			System.out.println(s2);
		} else {
			System.out.println("Sample4 객체가 아님...");
		}
		
		// Sample4 s2 = t2; // 컴파일 오류. down은 반드시 강제 캐스팅이 필요.
		Sample4 s2 = (Sample4)t2;
		Sample4 s3 = (Sample4)t3;
		System.out.println(s2.c+","+s3.c); // 200, 200
		Test4 t4 = (Test4)o;
		System.out.println(t4.a+","+t4.b); // 10, 20 필드는 무조건 자기것이 우선순위가 높다.
		Sample4 s4 = (Sample4)o;
		System.out.println(s4.a+","+s4.b+","+s4.c); // 10, 100, 200
		
	}
}
class Test4 {
	int a = 10;
	int b = 20;
	public void print() {
		System.out.println(a+":"+b);
	}
	public void disp() {
		System.out.println("disp...");
	}
	
}

class Sample4 extends Test4 {
	int b = 100;
	int c = 200;
	
	// 재정의
	public void print() {
		System.out.println(a+":"+super.b+":"+b+":"+c);
	}
	
	public void write() {
		System.out.println("write...");
	}
}

여기 자세히 봐야함. 보면서 그렇구나~ 하고 아는 것 같은데 했는데 

막상 다른 문제 보면 틀림ㅠㅠ

+ Recent posts