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() 메소드...
계속하려면 아무 키나 누르십시오 . . .
'Study Note > Java' 카테고리의 다른 글
JAVA_ Test113_ 인터페이스(Interface) 정의 (0) | 2018.06.16 |
---|---|
JAVA_ Test112_ 인터페이스(Interface) 정의 (0) | 2018.06.15 |
JAVA_ Test110_ 추상 클래스(Abstract) (0) | 2018.06.15 |
JAVA_ Test109_ 상속(Inheritance) / 메소드 오버라이딩(mathod Overriding)의 특징 (0) | 2018.06.15 |
JAVA_ Test107_ 클래스 / 상속(Inheritance) / 생성자와 클래스 상속간의 관계 /『super』정의 / @Override (0) | 2018.06.14 |
댓글