
부모 타입의 변수를 사용하게 되면 자식 타입에 있는 기능은 호출할 수 없다.
package poly.basic;
public class CastingMain1 {
public static void main(String[] args) {
// 부모 변수가 자식 인스턴스 참조 (다형적 참조)
Parent poly = new Child(); // x001
// 단 자식의 기능은 호출할 수 없다. 컴파일 오류 발생
// poly.childMethod();
// 다운캐스팅 (부모 타입 -> 자식 타입)
Child child = (Child) poly; // x001
child.childMethod();
}
}


poly.childMethod()를 호출하면 먼저 참조값을 사용해서 인스턴스를 찾는다.poly는 Parent 타입이다.Parent는 최상위 부모이다. 상속 관계는 부모로만 찾아서 올라갈 수 있다. childMethod()는 자식 타입에 있으므로 호출할 수 없다. 따라서 컴파일 오류가 발생한다.
호출하는 타입을 자식인 Child 타입으로 변경하면 인스턴스의 Child에 있는 childMethod()를 호출할 수 있다. 하지만 다음과 같은 문제에 봉착한다.
Parent parent = new Child() : 부모는 자식을 담을 수 있다.Parent parent = child // Child child 변수 : 부모는 자식을 담을 수 있다.반면에 자식은 부모를 담을 수 없다.
Child child = poly; // Parent poly 변수
부모 타입을 사용하는 변수를 자식 타입에 대입하려고 하면 컴파일 오류가 발생한다. 자식은 부모를 담을 수 없다.
이 때 다운캐스팅이라는 기능을 사용해서 부모 타입을 잠깐 자식 타입으로 변경하면 된다.
Child child = (Child) poly; // Parent poly
(타입)처럼 괄호와 그 사이에 타입을 지정하면 참조 대상을 특정 타입으로 변경할 수 있다. 이렇게 특정 타입으로 변경하는 것을 캐스팅이라 한다.
오른쪽에 있는 (Child) poly 코드를 먼저 보자. poly는 Parent 타입이다. 이 타입을 (Child)를 사용해서 일시적으로 자식 타입은 Child 타입으로 변경한다. 그리고 나서 왼쪽에 있는 Child child에 대입한다.
Child child = (Child) poly; // 다운캐스팅을 통해 부모 타입을 자식 타입으로 변환한 다음에 대입 시도
Child child = (Child) x001; // 참조값을 읽은 다음 자식 타입으로 지정
Child child = x001; // 최종 결과
참고로 캐스팅을 한다고 해서 Parent poly의 타입이 변하는 것은 아니다. 해당 참조값을 꺼내고 꺼낸 참조값이 Child 타입이 되는 것은 아니다. 따라서 poly의 타입은 Parent로 기존과 같이 유지된다.
“캐스팅”은 영어 단어 “cast”에서 유래되었다. “cast”는 금속이나 다른 물질을 녹여서 특정한 형태나 모양으로 만드는 과정을 의미한다.
Child child = (Child) poly 경우 Parent poly라는 부모 타입을 Child라는 자식 타입으로 변경했다. 부모 타입을 자식 타입으로 변경하는 것을 다운캐스팅이라 한다. 반대로 부모 타입으로 변경하는 것은 업캐스팅이라 한다.
// 다운캐스팅(부모 타입 -> 자식 타입)
Child child = (Child) poly;
child.childMethod();
다운캐스팅 덕분에 child.childMethod()를 호출할 수 있게 되었다. childMethod()를 호출하기 위해 해당 인스턴스를 찾아간 다음 Child 타입을 찾는다. Child 타입에는 childMethod()가 있으므로 해당 기능을 호출할 수 있다.
출처 : 김영한의 실전 자바 - 기본편
https://www.inflearn.com/course/%EA%B9%80%EC%98%81%ED%95%9C%EC%9D%98-%EC%8B%A4%EC%A0%84-%EC%9E%90%EB%B0%94-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard