C++

[C++] dynamic_cast

코딩 메모장 2025. 5. 11. 02:30
728x90

[C++] dynamic_cast

dynamic_cast는 C++에서 상속 관계의 클래스 간 안전한 형 변환을 위해 사용되는 연산자입니다. 주로 런타임 다형성(Run-Time Polymorphism)을 지원할 때 사용됩니다.


✅ 특징

  1. 런타임 타입 확인 (RTTI) 기반
    dynamic_cast는 런타임에 실제 객체의 타입을 확인합니다.
    반드시 가상 함수(virtual) 가 포함된 클래스에서만 사용할 수 있습니다.
  2. 주 용도는 다운캐스팅
    업캐스팅은 암시적으로 가능하지만, 다운캐스팅(기본 클래스 → 파생 클래스)은 dynamic_cast를 통해 안전하게 수행할 수 있습니다.
  3. 변환 실패 시 동작
    포인터 변환 실패 시: nullptr 반환
    참조 변환 실패 시: std::bad_cast 예외 발생

✅ 예제 코드

🔹 포인터 변환

class Base {
public:
    virtual ~Base() {}
};

class Derived : public Base {
public:
    void run() { std::cout << "Derived::run()" << std::endl; }
};

Base* base = new Derived();
Derived* derived = dynamic_cast<Derived*>(base);

if (derived) {
    derived->run();  // 성공 시 호출
} else {
    std::cout << "변환 실패" << std::endl;
}

🔹 참조 변환

try {
    Base& baseRef = *base;
    Derived& derivedRef = dynamic_cast<Derived&>(baseRef);
    derivedRef.run();
} catch (const std::bad_cast& e) {
    std::cerr << "예외 발생: " << e.what() << std::endl;
}

✅ 다중 상속 지원

dynamic_cast다중 상속(multiple inheritance) 상황에서도 올바른 서브 객체를 안전하게 찾아줍니다. 이는 static_cast로는 보장할 수 없는 기능입니다.

⚠️ 주의 사항

  • 비가상 클래스에서는 사용할 수 없습니다.
  • 런타임에 타입 확인을 수행하므로 성능이 중요한 곳에서는 남용을 피해야 합니다.
  • 안전한 다형성을 위해 설계된 구조에서는 가급적 가상 함수 호출로 처리하고, 변환은 최소화하는 것이 바람직합니다.

✅ 요약

항목 설명
사용 조건 클래스에 가상 함수가 있어야 함
사용 목적 런타임에 타입을 확인하며 안전하게 다운캐스팅
실패 시 동작 포인터: nullptr, 참조: std::bad_cast 예외
다중 상속 지원 O
성능 영향 RTTI를 사용하므로 static_cast보다 느릴 수 있음
728x90