본문 바로가기

Java

(상속) 업캐스팅과 다운캐스팅

훈수/저작권 관련 지적 환영합니다 - 댓글 또는 audgnssweet@naver.com

 

업 캐스팅과 다운 캐스팅


상속에서 업 캐스팅은 아래와 같이 요약할 수 있습니다.

상위 클래스 레퍼런스 변수에 하위 클래스 인스턴스를 담는다.

 

아래 예시를 보겠습니다.

class A {
}

class B extends A{
}

public class C extends B{
}

위와 같은 상속 구조에서

 

A = new B();
A = new C();
B = new C();

와 같이 상위 클래스 레퍼런스에 하위 클래스 인스턴스를 담는 것을 업 캐스팅이라고 합니다.

업 캐스팅 시에는 

위와 같은 구조를 갖기 때문에, 타입의 안전성이 보장됩니다.

예전에 자동 형 변환과 강제 형 변환에 대해서 다뤄본 적이 있었습니다.

 

업캐스팅시에는 위 그림처럼 타입의 안전성이 보장되기 때문에 자동 형 변환이 이뤄지는 것입니다.

 


다운 캐스팅이란 업 캐스팅의 반대입니다.

하위 클래스 레퍼런스로 상위 클래스 인스턴스를 가리키는 것을 의미합니다.

B = new A();
C = new A();
C = new B();

위처럼 말입니다.

이는 컴파일 오류로 이어집니다.

왜냐하면 

위와 같은 메모리 구조를 갖기 때문입니다.

실제 인스턴스는 B()인데, 레퍼런스가 C라면

접근할 수 없는 공간을 레퍼런스 변수를 통해 접근할 수 있기 때문에 타입의 안정성이 무너지게 됩니다.

그러므로 컴파일 에러가 발생하고, 이를 해결하기 위해서는 강제 캐스팅을 해줘야 합니다.

A a = new C();
C c = (C)a;

위처럼 개발자가

'컴파일러야 내가 책임질게. 일단 컴파일 통과시켜줘'

라고 전달해줘야 합니다. 이를 다운 캐스팅이라고 합니다.

 

그럼 마지막으로 컴파일러의 특성을 알 수 있는 한 가지 예시만 더 보겠습니다.

class A {
}

class B extends A{
}

public class C extends B{

    public static void main(String[] args) {
        B b = new C();
        C c = b;     //컴파일 에러
    }
}

아니 b는 현재 C 인스턴스를 가리키고 있는데, 그러면 C 레퍼런스 변수에 C인스턴스를 담는데 왜 컴파일 에러?

컴파일러는 런타임 시 상황을 모르기 때문에 실제로 B에 어떤 type의 인스턴스가 들어있는지는 알 수 없습니다. 

그렇기에 이 경우에도 명시적 캐스팅이 필요합니다.

 

여기까지 상속에서의 업 캐스팅과 다운 캐스팅에 대해 알아보았습니다.

'Java' 카테고리의 다른 글

(상속) 메서드 오버라이딩과 다형성  (0) 2021.05.11
(상속) 메서드 오버라이딩과 동적 바인딩  (0) 2021.05.07
(상속) 생성자 호출  (0) 2021.05.07
(상속) 부모 클래스 접근  (0) 2021.05.07
자바 상속 기본  (0) 2021.05.07