'C++' Casting operators

토스트·2025년 5월 6일

'C++' basic

목록 보기
28/35

Casting operator

C++에서 한 자료형의 값을 다른 자료형으로 변환할 때 사용됩니다.

C-style casting

C 언어에서 사용되던 방식입니다.

<예시>

double x = 3.14;
int y = (int)x; // double을 int로 변환

변환할 수 있는 타입이 무엇인지 명확하게 알 수 없기 때문에 안전하지 않을 수 있습니다.

static_cast

컴파일 타임에 타입 변환을 수행하며, 반환하려는 타입이 명확할 때 사용합니다.

  • 일반 변수 타입간의 변환, 클래스 계층에서 상속 관계를 따르는 변환

업캐스팅은 안전하지만, 다운캐스팅은 안전하지 않을 수 있습니다. dynamic_cast 권장

float x = 3.14;
int y = static_cast<int>(x);  // float을 int로 변환

잘못된 타입 변환을 시도하면 컴파일 에러가 발생합니다.

dynamic_cast

런타임에 타입 변환을 수행하며, 주로 다형성(polymorphism)을 사용할 때 사용됩니다.

  • 주로 포인터나 참조를 다른 타입으로 변환할 때 사용

적어도 하나의 가상 함수(virtual function)가 있어야 합니다.

#include <iostream>
using namespace std;

class Base {
public:
    virtual void show() { cout << "Base class" << endl; }  // 가상 함수
};

class Derived : public Base {
public:
    void show() override { cout << "Derived class" << endl; }
};

int main() {
    Base* b = new Base();  // Base 객체 생성
    Derived* d = dynamic_cast<Derived*>(b);
 	
    return 0;
 }

변환이 안전하지 않으면 nullptr 또는 예외를 발생시킬 수 있습니다.

const_cast

상수성(constness)을 변경할 때 사용됩니다. 주로 const가 붙은 변수에서 const를 제거하거나 추가할 때 사용됩니다.

const int x = 5;
int* y = const_cast<int*>(&x); // const 제거

*y = 10;

실제로 const로 선언된 변수에 대해 const_cast로 변경하는 것은 위험할 수 있습니다. 이는 const 규칙을 위반하는 것이기 때문에, 프로그램이 의도대로 동작하지 않을 수 있습니다.

reinterpret_cast

비트 수준에서 포인터나 참조를 강제로 변환할 때 사용됩니다.

int x = 42;
char* y = reinterpret_cast<char*>(&x);  // int 포인터를 char 포인터로 변환

reinterpret_cast는 매우 강력하고 위험할 수 있습니다. 타입이 전혀 다른 메모리 구조를 해석하게 되므로, 잘못 사용하면 프로그램이 예기치 않게 동작할 수 있습니다.

0개의 댓글