타입에 따른 업캐스팅과 다운캐스팅
기본자료형
- 업캐스팅 : 범위가 좁은 쪽에서 넓은 쪽으로 캐스팅
- 다운캐스팅 : 범위가 넓은 쪽에서 좁은 쪽으로 캐스팅
객체
- 업캐스팅 : 하위 클래스에서 상위 클래스로 캐스팅
- 다운캐스팅 : 상위 클래스에서 하위 클래스로 캐스팅
객체의 업 캐스팅과 다운 캐스팅
객체의 업 캐스팅은 항상 할 수 있으며, 명시적으로 적어주지 않아도 컴파일러가 대신 넣어준다.
객체의 다운 캐스팅은 반드시 명시적으로 적어주어야 하며, 또한 명시적으로 적어도 다운 캐스팅 자체가 안 될 때가 있다.
잘못된 다운 캐스팅을 수행하면 'ClassCastException'이라는 예외가 발생하며 프로그램이 종료된다.
public class Main {
public static void main(String[] args) {
Animal animal1 = new Animal();
Cat cat1 = new Cat();
// 업캐스팅 Cat -> Animal
Animal animal2 = (Animal)cat1; // 업 캐스팅
// 다운 캐스팅 Animal -> Cat
Cat cat2 = (Cat) animal2; // 다운 캐스팅
Cat cat3 = (Cat) animal1; // 다운 캐스팅 -> 'ClassCastException' 예외 발생, 프로그램 종료
}
}
class Animal {
}
// 동물의 기능과 속성을 상속한 Cat 클래스
class Cat extends Animal {
}
다운 캐스팅 시 메모리 구조
일상적인 예시 (개인적인 예)
- 예를 들어 다음과 같은 방 구조에서 큰 방에서 지내는 A군이 있다. -> 큰 방 A1 = new 큰 방();
- A군에게 작은 방으로 가서 컴퓨터를 하라고 한다. -> 작은 방 A2 = (작은 방)A1;
- A2.컴퓨터(); -> 컴퓨터가 없어 할 수 없음. (예외 발생)
- 다음은 위와 A군의 상황을 보고 B군은 작은 방에 자기의 물건을 옮겨 놓고 큰 방에서 지내기로 함. -> 큰 방 B1 = new 작은 방();
- B군에게 작은 방으로 가서 컴퓨터를 하라고 한다. -> 작은 방 B2 = (작은 방) B1;
- B2.컴퓨터(); -> 컴퓨터가 있으므로 할 수 있음.
자바의 메모리 예시
상위 클래스 자료형 + 하위 클래스 생성자
- 하위 클래스 생성자로 인스턴스를 생성하면 상위 클래스의 인스턴스가 먼저 생성되며 하위 클래스 인스턴스가 완성된다.
-> 하위 클래스 인스턴스 내부에 상위 클래스 인스턴스가 만들어짐 - 여기서 선언된 자료형은 실제 인스턴스에서 자신이 선언된 자료형의 인스턴스를 가리키는 역할을 하며
참조 변수는 하위 클래스 인스턴스 내부에 있는 상위 클래스의 인스턴스를 가리키게 된다. - 따라서 다운 캐스팅을 진행하게 되면 상위 클래스 인스턴스 외부에 있는 하위 클래스를 가리키게 되며 다운 캐스팅이 진행된다.
상위 클래스 자료형 + 상위 클래스 생성자
- 상위 클래스 생성자로 인스턴스를 생성하게 되면 상위 클래스 인스턴스만 생성하게 된다.
- 여기서 하위 클래스로 다운 캐스팅을 하면 가리킬 것(하위 클래스의 인스턴스)이 존재하지 않아 예외가 발생하며 프로그램이 종료된다.
캐스팅 조건
- 클래스 사이에 상속 관계가 존재해야 한다.
- 다운 캐스팅을 하려면 힙 메모리 내부에 다운 캐스팅하려는 인스턴스가 존재해야 한다.
- 즉, 인스턴스 생성 시 어떤 생성자를 통해 인스턴스를 생성했는지에 따라 가능 여부가 나눠진다.
'Langauge > Java-basic' 카테고리의 다른 글
[Java] 메서드 오버라이딩(Method Overriding) (0) | 2022.07.31 |
---|---|
[Java] instanceof : 캐스팅 가능 여부 확인 (0) | 2022.07.30 |
[Java] 상속 관계와 포함 관계 (0) | 2022.07.29 |
[Java] final 키워드 (0) | 2022.07.25 |
[Java] static 키워드 (0) | 2022.07.24 |