[인프런 Java] 다형성과 캐스팅

코드 속의 "진돌"·2024년 3월 19일
0
post-thumbnail

✅ 다형성과 캐스팅


부모 타입의 변수를 사용하게 되면 자식 타입에 있는 기능은 호출할 수 없다.

✏️ CastingMain1

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()를 호출하면 먼저 참조값을 사용해서 인스턴스를 찾는다.
  • 인스턴스 안에서 사용할 타입을 찾아야 한다. polyParent 타입이다.
  • 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 코드를 먼저 보자. polyParent 타입이다. 이 타입을 (Child)를 사용해서 일시적으로 자식 타입은 Child 타입으로 변경한다. 그리고 나서 왼쪽에 있는 Child child에 대입한다.



⚙️ 실행 순서

Child child = (Child) poly;  // 다운캐스팅을 통해 부모 타입을 자식 타입으로 변환한 다음에 대입 시도
Child child = (Child) x001;  // 참조값을 읽은 다음 자식 타입으로 지정
Child child = x001;  // 최종 결과

참고로 캐스팅을 한다고 해서 Parent poly의 타입이 변하는 것은 아니다. 해당 참조값을 꺼내고 꺼낸 참조값이 Child 타입이 되는 것은 아니다. 따라서 poly의 타입은 Parent로 기존과 같이 유지된다.



📚 캐스팅

  • 업캐스팅(upcasting) : 부모 타입으로 변경
  • 다운캐스팅(downcasting) : 자식 타입으로 변경



📚 캐스팅 용어

“캐스팅”은 영어 단어 “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

profile
매일 성장하는 주니어 개발자의 기록📝

0개의 댓글