포스트

[C++] 캐스팅

[C++] 캐스팅

C++ 캐스팅(Casting) 정리

1. 캐스팅이란?

타입 변환(Casting)은 변수나 객체를 한 타입에서 다른 타입으로 변환하는 행위이다. C++에서는 타입 안정성과 목적에 맞는 다양한 캐스팅 연산자를 제공한다.


2. C++의 주요 캐스팅 종류

연산자용도특징
static_cast일반적인 타입 간 변환컴파일 타임 타입 검사, 안전한 캐스팅
dynamic_cast클래스 상속 간 런타임 변환RTTI 기반, 실패 시 nullptr 반환 (포인터 기준)
const_castconst, 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

  • const 속성 제거 (주의 필요)
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 기반 시스템과의 호환성을 유지하는 것이 바람직함
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.