업캐스팅, 다운캐스팅
자바에서는 기본형 변수뿐만 아니라 참조 변수(객체)도 타입 변환이 가능하다
참조 변수의 타입 변환은 "어떤 멤버(필드, 메서드)를 사용할 수 있는지를 제한 또는 확장"하는 개념이다
이는 다형성을 제대로 이해하고 활용하기 위해 꼭 알아야한다
타입 변환의 전제조건
- 타입 변환은 반드시 상속관계에 있는 클래스 사이에서만 가능하다
- 상위 클래스 타입으로 변환하기(업캐스팅)
- 하위 클래스를 상위 클래스 타입으로 변환함
- 형변환 연산자 생략 가능
- 안전한 변환이며, 대부분 자동으로 일어난다
- 하위 클래스 타입으로 변환하기(다운캐스팅)
- 상위 클래스 타입의 참조 변수를 다시 하위 클래스 타입으로 변환함
- 형변환 연산자를 반드시 명시해야함
- 업캐스팅된 인스턴스에만 적용할 수 있음
예시
class Vehicle {
void startEngine() {
System.out.println("시동걸기");
}
}
class Car extends Vehicle {
void giveRide() {
System.out.println("사람을 태운다");
}
}
class MotoBike extends Vehicle {
void performTrick() {
System.out.println("묘기를 부린다");
}
}
public class VehicleTest {
Car car = new Car(); // Car 타입
// 업캐스팅(자동 변환, 형변환 연산자 생략 가능)
Vehicle vehicle = car;
// 다운캐스팅(명시적 변환이 필요함)
Car car2 = (Car)vehicle; // Vehicle 타입을 Car 타입으로 다운캐스팅
// 잘못된 캐스팅(상속관계가 아님)
MotoBike motoBike = (MotoBike)car; // Car와 MotoBike는 상속관계가 아님
// ClassCastException 발생
}
다형성과의 연관
- 업캐스팅은 주로 다형성을 활용하기 위해 사용된다
- 다형성 환경에서는 참조변수의 타입에 따라 접근 가능한 멤버가 제한되며, 실제 객체의 기능을 사용하기 위해선 다운캐스팅이 필요할 수도 있다고 한다.
Vehicle vehicle = new Car(); // 업캐스팅, 자식인 Car를 부모인 Vehicle 타입으로 참조함
((Car)vehicle).giveRide(); // 다운캐스팅, Car만이 가진 기능 사용을 위해서 형변환이 필요하다
정리
| 구분 | 업캐스팅 | 다운캐스팅 |
| 방향 | 하위 클래스 - > 상위 클래스(up) | 상위 클래스 - > 하위 클래스(down) |
| 형변환 여부 | 묵시적(형변환 연산자 생략 가능) | 명시적(형변환 연산자가 반드시 필요함) |
| 사용 목적 | 다형성을 활용해 여러 하위 객체를 동일한 상위 타입으로 처리함 | 상위 타입 참조변수를 통해 하위 타입 고유기능에 접근한다 |
| 안전성 | 안전함(컴파일, 런타임 모두 문제없음) | 위험(잘못된 캐스팅시 에러 발생) |
| 예시 | Vehicle vehicle = new Car(); | ((Car)vehicle).giveRide(); |
- 참조변수의 타입 변환은 상속관계를 전제로 한다
- 업캐스팅은 묵시적으로 자동 형변환되고, 다운캐스팅은 명시적으로 형변환 연산자를 써야한다
- 다운캐스팅은 반드시 업캐스팅된 인스턴스에만 사용할수 있으며, 그렇지 않으면 오류가 발생한다
- 다형성을 활용하려면 업캐스팅을 통해 상위 타입으로 통일하고, 필요한 경우에만 다운캐스팅을 사용해서 기능을 확장할 수 있다
- 타입변환의 개념은 유연하고 확장성 있는 코드 구조를 설계하기 위한 중요한 기반이 된다
'JAVA > 다형성(Polymorphism)' 카테고리의 다른 글
| instanceof (0) | 2026.04.17 |
|---|---|
| 다형성(Polymorphism) (0) | 2026.04.17 |