부모 타입의 변수를 사용하게 되면 자식 타입에 있는 기능은 호출할 수 없다.
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