JAVA

Test118.java / 클래스 고급 - 상속 관계에 있는 클래스들 간의 캐스팅 / 업 캐스팅, 다운 캐스팅

universedevelope 2022. 10. 22. 21:53
/*=========================
  ■■■클래스 고급■■■
=========================*/

// 상속 관계에 있는 클래스들 간의 캐스팅
// 업 캐스팅, 다운 캐스팅

// super class, 부모 클래스, 상위 클래스
class SuperTest118
{
	public int a =10, b = 20;
	public void write()
	{
		System.out.println("슈퍼 클래스 write() 메소드...");
	}

	public int hap()
	{
		return a + b;
	}
}

// sub class, 자식 클래스, 하위 클래스
class SubTest118 extends SuperTest118
{
	public int b = 100, c=200;
	
	@Override
	public int hap()
	{
		return a + b + c;
	}

	public void print()
	{
		System.out.println("서브 클래스 print() 메소드...");
	}
}

// main()메소드를 포함하는 외부의 다른 클래스
public class Test118
{
	public static void main(String[] args)
	{
		
		SubTest118 st118 = new SubTest118();	// sub 기반 인스턴스 생성

		System.out.println("st118.b : " + st118.b);  // st118.b : 100

		SuperTest118 ob2 = st118;	// SuperTest118 ob2 = (SuperTest118)st118;
									// 부모객체 타입으로 하위객체를 캐스팅하는것을 업 캐스팅

		System.out.println("ob2.b : " + ob2.b);	// ob2.b : 20

		System.out.println("합      : " + ob2.hap());	// 합 : 310  ( 오버라이드 되면 그거로 재정의 된다. )
																	// 자식의 입장에서 생각하기.
														// hap()은 업캐스팅된 SuperTest118에서 재정의한다.
														// 원래의 기능으로 못돌아가.
		ob2.write();	//슈퍼 클래스 write() 메소드...

		// ob2.print();	// 에러 발생 : cannot find symbol

		((SubTest118)ob2).print();	// 서브 클래스 print() 메소드... 
							        // 자식객체 타입으로 부모객체를 캐스팅하는 것을 다운 캐스팅

		// ※ 추가 관찰 ----------------------------------------------------
		//    다운 캐스팅 가능 여부

		SuperTest118 ob3 = new SuperTest118();

		SubTest118 ob4;

		// System.out.println(ob3.c);  → 컴파일 에러, 상위 객체는 하위 객체의 멤버에 접근하는 것이 불가능

		// ob4 = ob3; → 컴파일 에러, 상위 객체는 하위 객체에 담을 수(참조할 수) 없다.
		
		// ob4 = (SubTest118)ob3; → 런타임 에러, 작성된 구문의 문법적인 구조만 봤을 때 다운캐스팅이
							 	 //  이루어지는 상황이나 ...... 정상적인 캐스팅이 이루어지지 않는다.
								 //  메모리할당여부 때문.!		

		
	}
}

/*


○ 업 캐스팅, 다운 캐스팅이 정상적으로 이루어 지는 경우 -----------------------------------------------
	1. 하위 객체 생성;		// 제일 중요...................... 뭐든 될려면 자식 객체가 생성 되어있어야함.
	2. 상위 = 하위;			// 업 캐스팅. 정상.
	3. 하위 = 상위;			// 에러 발생.
	4. 하위 = (하위)상위;	// 다운 캐스팅. 정상.

○ 다운 캐스팅이 정상적으로 이루어지지 않는 경우
	1. 상위 객체 생성;		// 얘도 중요... 
	2. 하위 = 상위;			// 에러 발생.
	3. 하위 = (하위)상위;	// 다운캐스팅. 런타임 에러 발생.


	∴ 업 캐스팅은 항상 가능. 다운 캐스팅은 경우에 따라 가능.


*/
728x90