C++ 캐스팅(Casting) 정리
1. 캐스팅이란?
타입 변환(Casting)은 변수나 객체를 한 타입에서 다른 타입으로 변환하는 행위이다. C++에서는 타입 안정성과 목적에 맞는 다양한 캐스팅 연산자를 제공한다.
2. C++의 주요 캐스팅 종류
| 연산자 | 용도 | 특징 |
|---|
static_cast | 일반적인 타입 간 변환 | 컴파일 타임 타입 검사, 안전한 캐스팅 |
dynamic_cast | 클래스 상속 간 런타임 변환 | RTTI 기반, 실패 시 nullptr 반환 (포인터 기준) |
const_cast | const, volatile 속성 제거 | 위험 요소 존재, 주의 필요 |
reinterpret_cast | 포인터 등 메모리 재해석 | 비트 수준 변환, 매우 위험 |
2.1 static_cast
- 기본형 간 변환 (
int → float 등) - 업캐스팅 (자식 → 부모)
void* → 타입 포인터 변환
1
2
| float f = static_cast<float>(10);
Base* bp = static_cast<Base*>(derivedPtr);
|
2.2 dynamic_cast
- 다형성 타입 간 안전한 다운캐스팅
virtual 함수가 있는 클래스에서 사용 가능- 실패 시
nullptr 또는 bad_cast 예외
1
2
| Base* b = new Derived();
Derived* d = dynamic_cast<Derived*>(b); // 안전한 다운캐스트
|
2.3 const_cast
1
2
| const int a = 10;
int* p = const_cast<int*>(&a);
|
2.4 reinterpret_cast
- 포인터 → 포인터, 포인터 → 정수 등
- 비트 수준 변환, 매우 위험
1
2
| int a = 42;
char* p = reinterpret_cast<char*>(&a);
|
3. C 스타일 캐스팅 (Type)value
- static/const/reinterpret_cast 중 하나로 해석됨
- 타입 안정성이 떨어지고 의도가 명확하지 않음 → C++에서는 사용 비추천
1
| int a = (int)3.14; // C 스타일
|
4. 캐스팅 선택 가이드
| 상황 | 권장 캐스팅 | |——|————-| | 기본형 간 변환 | static_cast | | 업캐스팅 (자식 → 부모) | static_cast | | 다운캐스팅 (부모 → 자식) | dynamic_cast | | const 제거 | const_cast | | 포인터 재해석 | reinterpret_cast |
Unreal Engine에서의 캐스팅
Unreal Engine은 C++ 기반이지만 자체 UObject 시스템을 활용하므로 전용 캐스팅 함수를 사용한다.
1. 주요 캐스팅 방식
1.1 Cast<>() – 언리얼 추천
UObject, AActor, UComponent 등 간의 안전한 다운캐스팅- 실패 시
nullptr 반환
1
2
| AActor* Actor = GetOwner();
AMyCharacter* Char = Cast<AMyCharacter>(Actor);
|
1.2 CastChecked<>() – 실패 시 assert
- 실패 시 예외가 발생하는 안전 버전 (개발 중 유용)
1
| AMyCharacter* Char = CastChecked<AMyCharacter>(Actor);
|
1.3 IsA<>() – 타입 체크
1
| if (Actor->IsA<AMyCharacter>()) { ... }
|
2. Unreal에서 사용하지 않는 캐스팅
| C++ 캐스팅 | Unreal에서의 사용 여부 | 이유 |
|---|
dynamic_cast | ❌ 비활성화됨 (RTTI 미사용) | Unreal 빌드 설정에서 RTTI 제거됨 |
static_cast | ⛔ 사용 가능하지만 권장하지 않음 | Cast<>가 더 안전하고 명확함 |
reinterpret_cast | ⚠ 가능하지만 매우 제한적으로 | 위험, 메모리 손상 가능성 |
const_cast | ⚠ 가능하나 주의 요망 | 메모리 보호 무시 가능성 있음 |
3. 요약
- Unreal에서는
Cast<>, CastChecked<>, IsA<> 사용이 표준 - RTTI가 비활성화되어 있으므로
dynamic_cast는 사용하지 않음 - 일반적인 타입 변환은 여전히
static_cast 사용 가능하나 최소화 권장
결론
- C++에서는 용도에 맞는 4가지 캐스팅 연산자를 사용하여 타입 안정성과 의도를 명확히 할 수 있음
- Unreal Engine에서는 자체 제공하는 캐스팅 매크로(
Cast<>, IsA<>)를 활용하여 UObject 기반 시스템과의 호환성을 유지하는 것이 바람직함