본문 바로가기
Study Note/Java

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

by 시뮝 2018. 6. 15.
728x90


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

※ 업 캐스팅, 다운 캐스팅이 정상적으로 이루어지는 경우

   1. 하위 객체 생성; //-- check~~!!!★★

   2. 상위 = 하위; //-- 업 캐스팅. 정상.

   3. 하위 = 상위; //-- 에러 발생.

   4. 하위 = (하위)상위; //-- 다운 캐스팅. 정상.


※ 다운 캐스팅이 정상적으로 이루어지지 않는 경우

   1. 상위 객체 생성;

   2. 하위 = 상위; //-- 에러 발생.

   3. 하위 = (하위)상위; //-- 다운 캐스팅. 런타임 에러.


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


// super class

SuperTest.java

class SuperTest

{

public int a=10, b=20;

public void write()

{

System.out.println("슈퍼 클래스 write() 메소드...");

}

public int hap()

{

return a + b;

}

}


// sub class

SubTest .java

class SubTest extends SuperTest

{

public int b=100, c=200;

public int hap()

{

return a + b + c;

}

public void print()

{

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

}

}


// main() 메소드를 포함하는 외부 클래스

Test000.java

public class Test111

{

public static void main(String[] args)

{

// sub class 기반 인스턴스 생성

SubTest ob1 = new SubTest();

System.out.println("ob1.b : " + ob1.b);

//--==>> ob1.b : 100


// ○ 업 캐스팅

//SuperTest ob2;

SuperTest ob2 = ob1;

// 『SuperTest ob2 = (SuperTest)ob1;』 와 동일한 코드


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

//--==>> ob2.b : 20

//-- 변수는 객체별로 따로 할당되므로

//   변수 b 는 ob2 의 변수이다.


System.out.println("합    : " + ob2.hap());

//--==>> 합    : 30

//-- hap() 메소드는 오버라이딩(Overriding) 되어 있고

//   ob2 는 ob1 을 업캐스팅한 상태의 객체이므로

//   『SuperTest』 의 hap() 메소드를 호출하는 것이 아니라

//   『SubTest』 에서 재정의한 hap() 메소드를 호출하게 된다.

//   즉, 메소드는 업캐스팅이 되더라도

//   재정의(덮어쓰기)한 이상 원래의 기능으로 되돌릴 수 없다.


ob2.write();

//--==>> 슈퍼 클래스 write() 메소드...


//ob2.print();

//--==>> 에러 발생. → 다운 캐스팅 필요~!!!


((SubTest)ob2).print(); // 객체의 형변환 방법

//--==>> 서브 클래스 print() 메소드...


// ※ 추가 관찰 -------------------------------------------------------------

//    다운 캐스팅 가능 여부

SuperTest ob3 = new SuperTest();

SubTest ob4;


//System.out.println(ob3.c);

//--==>> 에러 발생


//ob4 = ob3;

//--==>> 에러 발생 (ob4가 ob3보다 작기 때문에 자동 형 변환 법칙에 위배된다.)

//--     상위 객체는 하위 객체에 담을 수(참조할 수) 없다.


//ob4 = (SubTest)ob3;

//--==>> 에러 발생(런타임 에러)

//--     작성된 구문의 문법적인 구조만 봤을 때

//       다운 캐스팅이 이루어지는 상황이다.

//       하지만 정상적인 캐스팅이 이루어지지 않는다.

//       현재 SubTest 객체에 대해 메모리 할당이 이루어지지 않은 상태이기 때문에

//       다운 캐스팅은 불가능한 것이다.


//System.out.println(ob4.c);

//--==>> 에러 발생(컴파일 에러)

}

}


cmd

ob1.b : 100

ob2.b : 20

합    : 310

슈퍼 클래스 write() 메소드...

서브 클래스 print() 메소드...

계속하려면 아무 키나 누르십시오 . . .







728x90

댓글