728x90
[C++] dynamic_cast
dynamic_cast
는 C++에서 상속 관계의 클래스 간 안전한 형 변환을 위해 사용되는 연산자입니다. 주로 런타임 다형성(Run-Time Polymorphism)을 지원할 때 사용됩니다.
✅ 특징
- 런타임 타입 확인 (RTTI) 기반
dynamic_cast
는 런타임에 실제 객체의 타입을 확인합니다.
반드시 가상 함수(virtual) 가 포함된 클래스에서만 사용할 수 있습니다. - 주 용도는 다운캐스팅
업캐스팅은 암시적으로 가능하지만, 다운캐스팅(기본 클래스 → 파생 클래스)은dynamic_cast
를 통해 안전하게 수행할 수 있습니다. - 변환 실패 시 동작
포인터 변환 실패 시: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
'C++' 카테고리의 다른 글
[C++] 가상 함수 (virtual function) (1) | 2025.04.23 |
---|---|
[C++] static_cast 란? (1) | 2025.04.22 |
[C++] string_view와 C 스타일 문자열 비교 (1) | 2025.04.20 |
[C++] type-specifier-seq / 타입 지정자 시퀀스란? (1) | 2025.04.19 |
[C++]init-statementopt condition의 개념과 활용 (1) | 2025.02.03 |