본문 바로가기

JAVA/다형성(Polymorphism)

참조 변수의 타입 변환(up-casting, down-casting)

업캐스팅, 다운캐스팅

 

자바에서는 기본형 변수뿐만 아니라 참조 변수(객체)도 타입 변환이 가능하다

참조 변수의 타입 변환은 "어떤 멤버(필드, 메서드)를 사용할 수 있는지를 제한 또는 확장"하는 개념이다

이는 다형성을 제대로 이해하고 활용하기 위해 꼭 알아야한다

 


타입 변환의 전제조건

  1. 타입 변환은 반드시 상속관계에 있는 클래스 사이에서만 가능하다
  2. 상위 클래스 타입으로 변환하기(업캐스팅)
    • 하위 클래스를 상위 클래스 타입으로 변환함
    • 형변환 연산자 생략 가능
    • 안전한 변환이며, 대부분 자동으로 일어난다
  3. 하위 클래스 타입으로 변환하기(다운캐스팅)
    • 상위 클래스 타입의 참조 변수를 다시 하위 클래스 타입으로 변환함
    • 형변환 연산자를 반드시 명시해야함
    • 업캐스팅된 인스턴스에만 적용할 수 있음

예시

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 발생
}

 


다형성과의 연관

  1. 업캐스팅은 주로 다형성을 활용하기 위해 사용된다
  2. 다형성 환경에서는 참조변수의 타입에 따라 접근 가능한 멤버가 제한되며, 실제 객체의 기능을 사용하기 위해선 다운캐스팅이 필요할 수도 있다고 한다.
Vehicle vehicle = new Car(); // 업캐스팅, 자식인 Car를 부모인 Vehicle 타입으로 참조함
((Car)vehicle).giveRide(); // 다운캐스팅, Car만이 가진 기능 사용을 위해서 형변환이 필요하다

 


정리

구분 업캐스팅 다운캐스팅
방향 하위 클래스 - > 상위 클래스(up) 상위 클래스 - > 하위 클래스(down)
형변환 여부 묵시적(형변환 연산자 생략 가능) 명시적(형변환 연산자가 반드시 필요함)
사용 목적 다형성을 활용해 여러 하위 객체를 동일한 상위 타입으로 처리함 상위 타입 참조변수를 통해 하위 타입 고유기능에 접근한다
안전성 안전함(컴파일, 런타임 모두 문제없음) 위험(잘못된 캐스팅시 에러 발생)
예시 Vehicle vehicle = new Car(); ((Car)vehicle).giveRide();

 

  1. 참조변수의 타입 변환은 상속관계를 전제로 한다
  2. 업캐스팅은 묵시적으로 자동 형변환되고, 다운캐스팅은 명시적으로 형변환 연산자를 써야한다
  3. 다운캐스팅은 반드시 업캐스팅된 인스턴스에만 사용할수 있으며, 그렇지 않으면 오류가 발생한다
  4. 다형성을 활용하려면 업캐스팅을 통해 상위 타입으로 통일하고, 필요한 경우에만 다운캐스팅을 사용해서 기능을 확장할 수 있다
  5. 타입변환의 개념은 유연하고 확장성 있는 코드 구조를 설계하기 위한 중요한 기반이 된다

'JAVA > 다형성(Polymorphism)' 카테고리의 다른 글

instanceof  (0) 2026.04.17
다형성(Polymorphism)  (0) 2026.04.17