'type casting'에 해당되는 글 1건

  1. 2007.10.31 c++ type casting - const_cast 2
내가 학생 때 프로그래밍을 배우면서 C++ 스타일의 캐스팅을 배운 기억이 나지 않는다.
물론 책에서 몇가지 예제가 있었기 때문에 이런 것들이 있다는 것은 알고 있었지만
실제로 내가 코딩을 하면서는 한 번도 사용해 본 적이 없다.

그러나 실전에서 많은 코드을 보면서
C++ 스타일의 캐스팅이 매우 유용하게 사용된다는 사실을 알게 되었다.
그리고 근래에는 나도 몇 프로젝트를 진행하면서 이 유용한 문법을 사용하면서
진작에 왜 이걸 몰랐을까라고 생각이 들었다.
혹시라도 이 내용을 잘 모르는 사람이 이걸 보고 도움이 되길 바란다.

C++ 스타일 캐스팅에서는 다음 4가지가 있다.
const_cast
dynamic_cast
reinterpret_cast
static_cast



우선은 const_cast 부터 ...

이것은 변수의 상수성을 제거한다. 즉, const 로 선언한 변수에서 const 를 무효화 한다는 의미이다.
그리고 중요한 것은 이 캐스팅이 포인터 혹은 레퍼런스 타입에만 사용하여야 한다는 것이다.

예를 들어, 만약 char * 를 파라미터로 받는 라이브러리가 있는데,
로컬 변수가 const char* 로 선언되어 있다면
const_cast 를 사용해서 별도의 처리 없이 함수를 호출 할 수 있다.

void some_function(char* str)
{
     // what this to do ...
}

void caller()
{
    const char* const_variable;
    some_fuction(const_variable); // <- error !!
    some_fuction(const_cast<char *>const_variable); // <- no problem : )
}

만약 const_cast 가 없다면 함수를 호출하기 위해서 별도 변수를 만들고,
그 변수에 값을 받아서 함수 파라미터로 넘겨야 하는 번거로움이 따른다.

다만, 원래 값이 const 로 선언되었다면, 그 의도에 따라 값을 변경하지 않아야 한다.
문법적인 규칙을 따르기 위해 변수의 상수성을 제거 하였지만,
const 변수의 값을 바꾸려는 의도로 이 캐스트를 사용한다면 부작용이 생길 수 있으니
되도록 사용하지 말아야 한다.
혹자는 const_cast 자체를 사용하지 않는 게 좋다고 하긴 하지만,
그래도 편하라고 있는 건데 잘 쓰면 좋지 않나 생각한다.
학생 시절 그렇게 사용하지 말라던 goto 문도 쓸데가 있으니 ... 그것 보단 낫다고 개인적으로 판단된다 -_-;

논리적으로 바르지 않은 const_cast 사용에 관하여. (아래 블로그 참조)
http://blog.naver.com/arcyze?Redirect=Log&logNo=60041966927

#include <iostream.h>

int main()
{
    const int a = 10;
    int *b = const_cast<int *>(&a);
    *b = 100;

    cout << a << "\t" << &a << endl;
    cout << *b << "\t" << b << endl;
   
    return 0;
}

// 결과
10                  0x0013FF7C
100                0x0013FF7C

실제로 VC++ 6.0, gcc 4.0.4 에서 컴파일 해서 실행하면 위와 같이 희한한 결과가 나온다.
아마도 컴파일러가 위와 같은 문장을 비정상적 코드로 판단하고
내부적으로 자체처리 하고 있는 게 아닐까 생각된다.
reinterpret_cast 에서도 이와 비슷한 기능이 있는 것 같다.
(이에 대해서는 나중에 써 보겠다.)

* const_cast 는 volatile 로 선언된 변수에 대해서도 비슷하게 무효화 해 주는 역할을 한다.
다만, volatile 는 잘 사용하지 않으므로 여기서는 생략한다.
(사실 나도 volatile 는 써 본 적이 없다-_-)

참조 : Effective C++ 3rd Edition / by Scott Meyers
: