본문 바로가기

📚Study Note/JAVA

[ JAVA ] 클래스 고급 - 상속 관계에 있는 클래스들 간의 캐스팅 ( 업 캐스팅, 다운 캐스팅 )

// 상위 클래스=부모클래스
class SuperTest111
{
	public int a=10 , b=20;

	public void write()
	{
		System.out.println("SuperClass write() 메소드,,,");
	}
	public int hap()
	{
		return a+b;
	}
}
//하위 클래스 = 자식 클래스
class SubTest111 extends SuperTest111
{
	public int b=100 , c=200;
	@Override //c까지 더하도록 재정의
		public int hap()
	{
		return a+b+c;

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

}
// main() 메소드를 포함하고 있는 외부의 다른 클래스
public class Test111
{
	public static void main(String[] args)
	{
		// 하위 클래스(sub class : SubTest111) 기반의 인스턴스 생성
		SubTest111 ob1 = new SubTest111();

		System.out.println("ob1.b : " + ob1.b);
		//-==>> ob1.b : 100


		// ● 업 캐스팅
		SuperTest111 ob2 = ob1;
		//『SuperTest111 ob2 = (SuperTest111)ob1; 과 동일한 코드
		// b를 200으로 바꿔도 int 형에 대입된다

		System.out.println("ob2.b : " + ob2.b);
		//-==>>ob2.b : 20
		//두 객체가 같은 지점을 공유하는것이아니라 메모리의 다른곳에 각각 할당되엉ㅆ음 덮어씌우기 되는 것이 아니라
		// 변수는 객체별로 따로 할당되므로 변수 b는 ob2의 변수이다.

		ob2.write();
		//-==>> SuperClass write() 메소드,,,

		//ob2.print();
		//-==>> cannot find symbol  symbol:   method print()
		//컴파일 에러 발생 -> 다운 캐스팅 필요하다
		//● 다운캐스팅
		((SubTest111)ob2).print();
		//-==>>서브클래스 print() 메소드


		// ※ 추가적인 관찰 ======================================================


		SuperTest111 ob3 = new SuperTest111();
		SubTest111 ob4;

		//System.out.println("ob3.c : " + ob3.c);
		//-==>> cannot find symbol  symbol:   variable c
		// 부모가 자식클래스의 변수에 접근할 수 없다.
		// 상위 객체는 하위 객체의 멤버에 접근하는 것이 불가능하다.

		//ob4 = ob3; 
		//int타입의 변수를 byte 타입의 변수로 형변환하려고 하니 에러가 발생한다
		//상위 객체는 하위 객체에 담을 수(참조할 수 ) 없다.

		//ob4 = (SubTest111)ob3; //만약 21억 담겨있으면?

		//런타임에러 :Exception in thread "main" java.lang.ClassCastException: SuperTest111 cannot be cast to SubTest111 at Test111.main(Test111.java:86)

		//작성된 구문의 문법적인 구조만 봤을 때 다운 캐스팅이 이루어지는 상황이다.
		// 하지만, 정상적인 캐스팅이 이루어지지 않는다.
		// 현재, SubTest111 객체에 대해 메모리할당이 이루어지지않은 상태이기 때문에
		// 다운캐스팅은 불가능한 것이다.

		//System.out.println("ob4.c : "+ ob4.c);
		//-==>> 에러 발생(컴파일 에러)

		/*
		● 업캐스팅 , 다운캐스팅이 정상적으로 이루어지는 경우
		
		
		
		1. 하위 객체 생성                      // ★
		2. 상위 = 하위						   // 업캐스팅. 정상
		3. 하위 = 상위;							//다운캐스팅인데 이렇게는 안된다. 에러발생
		4. 하위 = (하위)상위;					// 다운캐스팅 정상				
		
		● 다운캐스팅이 정상적으로 이루어지는 않는 경우

		1. 상위 객체 생성;						// ★
		2. 하위 = 상위;							// 에러 발생
		3. 하위 = (하위) 상위;					// 다운캐스팅(문법적으로), 그렇지만 런타임 에러
		
	※ 업 캐스팅은 항상 가능, 다운 캐스팅은 경우(상황) 에 따라 가능.

	포유류

	사람 길동 = new 사람();

	포유류 객체1 = 길동;      //업캐스팅

	사람 길동 = (사람)객체1;  //다운캐스팅

	--------------------------------------------------

	포유류 객체2 = new 포유류();

	사람 길동 = 객체2;

	//현재 생성된 객체가 상위클래스 , 이거는 안되는 상황

	사람 길동 = (사람)객체2;      // 다운캐스팅
	//포유류로 만들어진 걸 사람에 넣겠다는 것은 이건 런타임에러 발생함
	//자식객체인스턴스는 업캐스팅도되고 다운캐스팅도됩니다. 
		
		
		*/




	}
}