[c++] 타입 캐스팅 방식(형변환)

C언어에서 제공하는 타입캐스팅

int i1 = (int)myFloat;

C++에서 제공하는 네 가지 타입캐스팅 + @

  • static_cast
    언어에서 지원하는 가장 일반적인 타입캐스팅

    int n = 9;
    double result = static_cast<double>(n);

    객체를 클래스 계층에서 다운캐스팅할 때 사용 가능
    객체 참조형에서 사용 가능(객체 자체 X)

    Parent* parent = new Parent();
    Child* child = static_cast<Child*>(parent);  
  • dynamic_cast
    런타임 타입 정보 검사를 수행하여 변환이 적합한 클래스 계층 간 이동인지 확인
    런타임 타입 정보는 vtable에 저장되기 때문에 dynamic_cast가 타입 검사를 하기위해서는 클래스에 하나 이상의 virtual 메서드가 있어야 함

  • const_cast
    상수 속성을 없애는 캐스팅 방법
    라이브러리를 사용하는 등의 상황에서 융통성을 발휘하여 사용하는 경우가 있음

    //예시
    extern void LibraryMethod(int* n);
    void myMethod(const int* n)
    {
    	LibraryMethod(const_cast<int*>(n));
    }
  • reinterpret_cast

    static_cast 보다 강력한 캐스팅 방법
    전혀 관계없는 타입으로 변환 가능

    T1* tp = new T();
    T2* tp2 = new T2();
    tp = reinterpret_cast<T1*>(tp2);
  • 타입 생성자 함수 이용
	int n = int(myFloat);



  • 타입캐스팅 방법 정리

    상황캐스팅 방법
    const 속성 제거cosnt_cast
    int, double 간 변환처럼 언어 자체에서 허용되는 변환을 명시적으로 수행static_cast
    커스텀 생성자나 변환 연산자가 구현되어 있을 때의 명시적인 변환static_cast
    전혀 관계없는 두 객체 간의 변환불가능
    같은 클래스 계층에 속하는 서로 다른 클래스 객체의 포인터 간 변환dynamic_cast or static_cast
    같은 클래스 계층에 속하는 서로 다른 클래스 객체의 참조 간 변환dynamic_cast or static_cast
    전혀 관계없는 두 포인터 간의 변환reinterpret_cast
    전혀 관계없는 두 참조 간의 변환reinterpret_cast
    함수 포인터 간의 변환reinterpret_cast

  • 결론

    기본 자료형의 타입캐스팅은

    double myD = 1.1;
    int n = (int)myD;
    int n2 = int(myD);

    와 같은 방식으로 변환하는 것이 가독성에 더 좋아보이며
    이를 제외하고는 위에 설명한 타입캐스팅 방식을 활용하여
    명시적으로 보여주는 것이 좋아 보임

좋은 웹페이지 즐겨찾기