본문 바로가기
Programming/C & C++

C++ Casting 관련 (it needs code test)

by leanu 2008. 9. 17.

Before Introduction of the casting
--------------------------------------------------------------------------------------------

Casting에 대한 설명 전에 당부하고 싶은 말은, 되도록 Casting 횟수를 최소화 하라는 것이다. 왜냐하면 Casting을 하다보면 틀린 코드를 쓰고도 모르는 경우가 발생할 수 있으며, Casting시 Overhead가 있기 때문이다. 꼭 필요한 것인지 다시한번 생각해볼 필요가 있는 녀석이다.

또하나 당부하고 싶은 말은, 구형스타일의 캐스트를 쓰려거든 (예) (int)32.353 C++스타일의 캐스트를 사용하라는 것이다. 코드상에서 캐스팅 영역을 발견하기도 편하고, 그로 인해 프로그래머의 의도를 좀더 쉽게 파악할 수 있기 때문이다.



Introduction & Details of the casting
--------------------------------------------------------------------------------------------

0. How to Use 

        : xxx_cast<변환타입>(변환할값)

1. static_cast

     : 일반적인 C 형태의 캐스팅이라고 생각하면된다. 변환 자료형을 써줄 필요가 없고, 특정
       자료형으로 강제로 변환하고자 할 경우에는 <> 를 이용한다.(되도록 자료형을 써주자)
       위험한 형변환시 (할당되지 않은 영역까지 침범하는 캐스팅) 에러를 발생시킨다. 하지만
       런타임시 변환에 대한 안전성보장을 하지 않으므로, dynamic_cast와 이것중 뭘 선택해야
       하는지는 프로그래머에 달려있다.

 (예1) double d = 2.3; int i = static_cast(d);
 (예2) void *b = malloc(sizeof(int) * 3); int* pi = static_cast<int>(b);

2. const_cast

      : const 형 포인터의 const 를 벗기기 위해 사용한다. 혹은 Volatileness를 제거하는 용도로도
        쓰인다.

 (예1) const int* t = new int[2]; int* e = const_cast(t);

3. reinterpret_cast

       : 전혀 관계없는 타입끼리의 캐스팅에 사용하는 강제형변환의 하나이다. Low Level에서 이용
         되며, 적용결과는 구현환경에 의존적이다(다시말해 이식성이 없다.) Low Level 제어이외에는
         사용을 금해야 하는 casting 연산자이다.

 (예1) void *b = malloc(sizeof(int) * 3); int* pi = reinterpret_cast<int>(p);

4. dynamic_cast

        : 주로 주어진 객체가 어떤 클래스 상속계통에 속한 타입인지를 결정하는 작업에 쓰인다.
          (Pointer 나 Reference)
 
          왜냐하면 캐스팅할 객체가 캐스팅 목표 객체로 변환 가능하면 그 타입의 포인터를 리턴하고
          실패하면 NULL을 리턴하기 때문이다. 상당히 신경쓰일 정도로 런타임 비용이 높은 캐스팅
          연산자이다. 캐스팅 가능여부를 판단하기위해 그 객체를 조사하게 되는데, 상속깊이가 깊거나
          다중상속이라도 쓰게 된다면 오버헤드가 크게 된다. 수행성능에 민감한 프로그램의 경우
          이 녀석의 사용에 신중을 기하자.


댓글