학원/JAVA

10/4 14-8 Type Casting

도원결의 2022. 10. 4. 23:35

참조형 사이의 형변환(Type Casting)
 두 클래간의 상속관계가 존재할때 형변환이 가능하다.
 형변환시 타입캐스팅 연산자: (자료형) 사용
 부모클래스 -> 자식클래스의 인스턴스에 저장(Down Casting)
 자식클래스 -> 부모클래스의 인스턴스 저장(Up Casting)
 
[업 캐스팅] 
부모의 인스턴스 변수 = 자식의 인스턴스 변수; 
묵시적 형변환으로 캐스팅 연산자를 사용할 필요가 없다. 작은걸 큰 그릇에 넣는것일 뿐

[다운 캐스팅]
자식타입의 인스턴스 변수= (자식타입)부모의 인스턴스변수
강제적 형변환 즉 캐스팅 연산자 사용  큰걸 작은그릇에 우겨넣어야 함

  ※만약에 부모의 인스턴스변수에 자식의 인스턴스 변수가 저장되어 있지 않다면
  다운캐스팅 하더라도 실행시 에러   => 구조를 가지고 있지 않아
 
  다운캐스팅 조건: 반드시 부모의 인스턴스 변수에 자식의 인스턴스 변수가 저장되어 있어야 한다
                  
class Base{============부모
            void base() {
                  System.out.println("Base의 메소드:base()");
                              }
                     }
class NoDerived{ }  ==========상속 없음

 
class Derived  extends Base{===========자식
              void derived () {
                   System.out.println("Derived의 메소드:derived()");
                                      }

@Override
void base() {
System.out.println("Derived에서 오버라이딩한 메소드:base()");
                     }
             }

public class RefTypeCasting {

public static void main(String[] args) {=============메소드
Base base = new Base();
    base.base();

Derived derived = new Derived();
   derived.base();

NoDerived noDerived = new NoDerived();
    noDerived = base;     상속관계없을 때 주소대입도 형변환도 안됨
   base=Derived;
    noDerived = (NoDerived)base;
    base=(Base)Derived;                   다 안됨

   상속관계시 주소대입도 형변환도 다 됨
System.out.println("[base인스턴스 변수에 derived인스턴스 변수 대입 전]");
System.out.println("base변수가 참조하는 타입:"+base.getClass().getName());
System.out.println(base instanceof Derived);
System.out.println((Derived)base);     =>Derived 구조가 없어서 안됨
System.out.println("[base인스턴스 변수에 derived인스턴스 변수 대입 후]");
               base = derived;       참조하는게 달라졌음   => 업 캐스팅
System.out.println("base변수가 참조하는 타입:"+base.getClass().getName());
System.out.println(base instanceof Derived);
base.derived();   다운캐스팅하기
((Derived)base).derived();     다운캐스팅