본문 바로가기

프로그래밍/JAVA

class 캐스팅

◇ Lvalue의 상위 클래스(father)이고, Rvalue가 하위 클래스(son:father을 상속받은)로 메모리를 생성할 때
    별도의 타입캐스팅이 없이 가능.
 
     father fa = new son();

◇  이 때 fa의 참조변수로 메소드의 호출 시에는 son 클래스의 메소드가 호출 됨.
     단, son 클래싀 모든 메소드에 접근 가능한 것은 아니며, father 클래스가 가지고 있는 명세에 있는 메소드만
     호출 가능이 가능하다.



◇ 반대로 Lvalue 가 하위 클래스(son)이고, Rvalue가 상위 클래스(father)로 메모리를 생성 할 때는  타입 캐스팅
   을 하지 않으면, 에러.  그러나, 타입캐스팅을 해서 생성한다고 해도  실제 사용 시에 런타임 에러 발생.
   즉, 실제적으로 사용 불가함.

  1. son s = new father();   // 컴파일 에러
  2. father f = new father();
     son s = (son)f ;           // 런타임 에러                  ClassCastException
  3. son s = (son)new father(); // 런타임 에러            ClassCastException

 
◇  그러나 다음과 같은 경우에는 사용 가능함.
     father fa = new son();
    1. son s = (son)fa;
        s.show();  // 사용 가능. 메모리 공간에 생성된 것이 son 클래스임..
    2. ((son)fa).show();
 

◇  사전에 캐스트가 가능한지 확인.
   검사객체  instance of 타입명                 → 타입명의 참조변수에 검사객체를 캐스팅할 수있는지
   ex)    son s = new son();
           father f = new father();
        →  s instanceof father : true                 → father 참조변수에 s를 캐스팅해서 넣을 수 있음.
        →  f instanceof son : false                   → son 참조변수에 f를 캐스팅해서 넣을 수 없음.
   
    ※  타입명이 검사객체와 같은 클래스이거나 상위 클래스 일 경우에 true가 됨.
        

Ex)

class father{ }

class son extends father{ }

class Test {
                  public static void main(String args[])  {
                  son s = new son();
                  father f = new father();
                  System.out.println("son instance of father : "+ (s instanceof father));
                  System.out.println("father instance of father : " + (f instanceof son));
               }
}

결과 : true / false