// 상위 클래스=부모클래스
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; // 다운캐스팅
//포유류로 만들어진 걸 사람에 넣겠다는 것은 이건 런타임에러 발생함
//자식객체인스턴스는 업캐스팅도되고 다운캐스팅도됩니다.
*/
}
}