[JAVA]16일차(업 캐스팅/다운 캐스팅)
8월5일(목)
Test112
상속 관계에 있는 클래스들 간의 캐스팅 == 업 캐스팅 / 다운 캐스팅
업 캐스팅 / 다운 캐스팅
▪ 업 캐스팅, 다운 캐스팅이 정상적으로 이루어지는 경우
- 하위 객체 생성; //-- check~!!!
- 상위 = 하위; // 업 캐스팅. 정상.
- 하위 = 상위; // 에러 발생.
- 하위 = (하위)상위; // 다운 캐스팅. 정상.
▪ 다운 캐스팅이 정상적으로 이루어지지 않는 경우
- 상위 객체 생성; //-- check~!!!
- 하위 = 상위; // 에러 발생.
- 하위 = (하위)상위; // 다운 캐스팅. 런타임 에러 발생
※ 업캐스팅은 항상 가능. 다운 캐스팅은 경우에 따라 가능.
▪ 업 캐스팅 / 다운 캐스팅 코드 설명📝
// super class, 부모 클래스, 상위 클래스
class SuperTest112
{
public int a=10, b=20;
public void write()
{
System.out.println("슈퍼 클래스... write() 메소드...");
}
public int hap()
{
return a + b;
}
}
//sub class, 자식 클래스, 하위 클래스
class SubTest112 extends SuperTest112
{
public int b=100, c=200;
@Override
public int hap()
{
return a + b + c;
}
public void print()
{
System.out.println("서브 클래스... print() 메소드...");
}
}
// main() 메소드를 포함하는 외부의 다른 클래스
public class Test112
{
public static void main(String[] args)
{
//sub class 기반 인스턴스 생성
SubTest112 ob1 = new SubTest112();
System.out.println("ob1.b : " + ob1.b);
//--==>> ob1.b : 100
// ○ 업 캐스팅
//superTest112 ob2;
SuperTest112 ob2 = ob1; //『SuperTest112 ob2 = (SuperTest112)ob1;』
/*
학생 중호 = new 학생(); -> 이러면 학생인 중호가 만들어짐
인간 사람 = 중호; // 『인간 사람 = (인간)중호;』 과 동일한 코드
byte a = 10;
short b = a; // 『short b = (short)a;』과 동일한 코드
*/
System.out.println("ob2.b : " + ob2.b);
//--==>> ob2.b : 20
//-- 변수는 객체별로 따로 할당되므로
// 변수 b는 ob2의 변수이다.
System.out.println("합 : " + ob2.hap());
//--==>> 합 : 310 100 + 200 + 10
//-- hap() 메소드는 오버라이딩(Overriding) 되어 있고
// ob2 는 ob1 을 업캐스팅한 상태의 객체이므로
// 『SuperTest112』의 hap() 메소드를 호출하는 것이 아니라
// 즉, 메소드는 업캐스팅 되더라도
// 재정의(덮어쓰기)한 이상....원래의 기능으로 되돌릴 수 없다.
ob2.write();
//--==>> 슈퍼 클래스... write() 메소드...
//ob2.print(); //업캐스팅 되었으니까 슈퍼테스트 입장에서는 print메소드가 없음! 그리고 자식이 print가지고 있는지도 모름! 자식은 다 알고있지만 부모는 모름
// 에러남 (cannot find symbol)
// ○ 다운 캐스팅
((SubTest112)ob2).print();
//--==>>서브 클래스... print() 메소드...
/*
byte a = 10;
short b = a;
byte c = b;
//byte c = (byte)b; 강제형변환됨
// 이거랑 같은 개념임 위에 ((SubTest112)ob2).print(); 가
//byte(1바이트) > short(2바이트) > int(4바이트) > long(8바이트)
*/
// ※ 추가 관찰 --------------------------------------------------
// 다운 캐스팅 가능 여부
SuperTest112 ob3 = new SuperTest112(); //부모를 생성
SubTest112 ob4;
//System.out.println(ob3.c); //부모를 생성하고 c에 접근하겠다고 하는격 (부모는 어떤자식이 있는지도 모름!!!!)
//--==>> 에러(cannot find symbol)
//-- 상위 객체는 하위 객체의 멤버에 접근하는 것이 불가능하다.
//ob4 = ob3; // ob4를 선언만 하고 할당안해서 에러발생
/* ↓↓↓ 위에 업캐스팅이랑 비교하면 이상황인것
SubTest112 ob1 = new SubTest112();
SuperTest112 ob2 = ob1;
SuperTest112 ob3 = new SuperTest112();
SubTest112 ob4 = ob3;
자식 ob1 = new 자식(); //자식 인스턴스 생성할때 부모도 올라감!!!
부모 ob2 = ob2;
부모 ob3 = new 부모(); //부모 인스턴스 생성할때는 자식 안올라감!!!
자식 ob4 = ob3;
*/
//ob4 = (SubTest112)ob3;
//--==>> 에러 발생(컴파일 에러)
// ※ 작성된 구문의 문법적인 구조만 봤을 때
// 다운 캐스팅이 이루어지는 상황이다.
// 하지만, 정상적인 캐스팅이 이루어지지 않는다
/// 현재 subTest112객체에 대해 메모리 할당이 이루어지지 않은 상태이기 때문에
// 다운 캐스팅은 불가능한 것이다..
}
}
Author And Source
이 문제에 관하여([JAVA]16일차(업 캐스팅/다운 캐스팅)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@hyojin_j/JAVA16일차업-캐스팅다운-캐스팅저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)