10/4 14-8 Type Casting
참조형 사이의 형변환(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(); 다운캐스팅