[C++] 12 캐스팅(Casting)

김진우·2025년 5월 26일

C++

목록 보기
12/16
post-thumbnail

캐스팅

정의

객체나 값의 자료형을 명시적으로 변환하는 기능이다.

전통적인 C 스타일 캐스팅C++ 스타일 캐스팅으로 나눌 수 있다.


C 스타일 캐스팅

(변환할 타입) 변수명

예시:

int a = 10;
double b = (double)a;  // C 스타일 캐스팅
  • 캐스팅 종류에 상관없이 문법만 맞으면 무조건 통과되므로 안전성이 보장되지 않는다.
  • 원하는 자료형으로 변환이 되었는지 실행을 통해 확인해야 한다.

C++ 스타일 캐스팅

1. static_cast

  • 일반적인 타입 변환에 사용됨 (예: int → float).
  • 컴파일 타임에 실행되며, 논리적으로 맞는 경우 캐스팅 가능.
  • 포인터 타입의 경우, 상속 관계에서만 변환 가능.

사용 예시:

float f = 3.14f;
int i = static_cast<int>(f);

2. dynamic_cast

  • 런타임에 타입을 체크하는 방식.
  • RTTI (Run-Time Type Information) 사용 → Base 클래스에 반드시 virtual 함수가 필요.
  • 캐스팅 실패 시:
    • 포인터는 nullptr 반환.
    • 참조는 예외 발생.

사용 예시:

class CTest_A {
public:
    virtual ~CTest_A() {
        printf("CTest_A 소멸 \n");
    }
};

class CTest_B : public CTest_A {
public:
    virtual ~CTest_B() {
        printf("CTest_B 소멸 \n");
    }
    int b = 0;
};

class CTest_C : public CTest_A {
public:
    virtual ~CTest_C() {
        printf("CTest_C 소멸 \n");
    }
    int c = 1;
    int d = 2;
};

CTest_A* temp = new CTest_B();
CTest_B* tempB = dynamic_cast<CTest_B*>(temp); // 캐스팅 가능
CTest_C* tempC = dynamic_cast<CTest_C*>(temp); // 캐스팅 불가 → nullptr

3. const_cast

  • const, volatile 등의 한정자만 추가/제거 가능.
  • 실제 타입은 변하지 않음.
  • const로 선언된 객체를 수정하면 예상하지 못하는 동작이 발생할 수 있음 → 주의 필요.

사용 예시:

const int x = 10;
int* px = const_cast<int*>(&x);
*px = 20; // 정의되지 않은 동작: 원래 const 객체는 수정 불가

4. reinterpret_cast

  • 비트 수준에서 강제 타입 변환 수행.
  • 포인터나 정수 등을 다른 완전히 다른 타입으로 재해석할 때 사용.
  • 안전하지 않으며, 정확한 동작은 런타임에 결정됨.

사용 예시:

int a = 10;
void* ptr = reinterpret_cast<void*>(&a);
int* intPtr = reinterpret_cast<int*>(ptr);

RTTI

C++에서 런타임에 객체의 실제 타입 정보를 얻을 수 있는 기능이다.
가상 클래스(virtual 함수가 있는 클래스)에만 적용 된다.

대표 기능
1. typeid : 타입에 대한 id => typeinfo 헤더를 추가해야 사용 가능
2. type_info : 타입에 대한 정보 (클래스 명)
3. dynamic_cast : 캐스팅 수행 정보

동적 캐스팅을 할 때 실제로 hashing된 id로 RTTI가 캐스팅 체크를 해준다.
두 객체의 hash id를 비교해 같으면 캐스팅 성공이 되고 다르면 실패(nullptr 또는 예외)가 된다.

0개의 댓글