static_cast, dynamic_cast, const_cast, reinterpret_cast)dynamic_cast가 기본 선택인지 설명할 수 있다.const_cast/reinterpret_cast가 왜 고위험인지 설명할 수 있다.static_cast: 일반적인 값 변환 + 컴파일타임 기준 변환주 용도:
int -> float)float ratio = static_cast<float>(hp) / maxHp; // 값 변환
Player* p = static_cast<Player*>(knightPtr); // 업캐스팅(예시)
주의:
Player* -> Knight*)도 문법상 가능하지만dynamic_cast: 런타임 타입 검증이 필요한 다운캐스팅전제:
virtual 함수 최소 1개)if (Weapon* w = dynamic_cast<Weapon*>(item)) {
int dmg = w->GetDamage();
}
핵심:
nullptrstd::bad_cast 예외const_cast: const/volatile 한정자만 조정void UseMutable(char* p);
const char* src = "abc";
UseMutable(const_cast<char*>(src)); // 매우 위험할 수 있음
핵심:
reinterpret_cast: 비트/주소를 다른 타입으로 해석#include <cstdint>
std::uintptr_t addr = reinterpret_cast<std::uintptr_t>(ptr);
핵심:
| 캐스팅 | 핵심 용도 | 안전성/주의 |
|---|---|---|
static_cast | 일반 변환, 업캐스팅 | 다운캐스팅 검증 없음(주의) |
dynamic_cast | 안전한 다운캐스팅 | RTTI/virtual 필요, 실패 시 null/예외 |
const_cast | const 한정자 조정 | truly const 수정 시 UB |
reinterpret_cast | 저수준 비트/주소 해석 변경 | 가장 위험, 극히 제한적으로 사용 |
static_castdynamic_castconst_castreinterpret_cast