static_cast vs c-style cast c++ 스타일 캐스팅을 써야 해

c++ 에서는 가급적 c style cast 보다
static_cast
dynamic_cast
reinterpret_cast
const_cast
사용하자

이중 일단 static_cast 를 써야 하는 이유를 살펴보자

int integerValue = 1;
char charValue = 'c';

printf("int value >%d \n", integerValue);
printf("char value >%c \n", charValue);

int* integerPointer = (int*)(&integerValue);
printf("int value by case pointer >%d \n", *integerPointer);

int* char2integerPointer_cstyle = (int*)(&charValue);
printf("int value by wrong cast >%d \n", *char2integerPointer_cstyle);

char* int2charPointer_cstyle = (char*)(&integerValue);
printf("int value by wrong cast >%c \n", *char2integerPointer_cstyle);

int* char2integerPointer_cxxstyle = static_cast<int*>(&charValue); // compile errror!!
printf("int value by wrong cast >%d \n", *char2integerPointer_cxxstyle);

char* int2charPointer_cxxstyle = static_cast<char*>(&integerValue); // compile errror!!
printf("int value by wrong cast >%d \n", *int2charPointer_cxxstyle);

위 코드는
int 형 변수 하나 char 형 변수 하나를
서로 반대의 pointer 로 casting 할 경우에 대해서 테스트 한다

게다가 char값의 주소를 int* 로 강제 형변환 한 경우 해당 위치의 실제 값을 억지로 charr* 로 확인해보면 위처럼 첫 바이트만 원래의 char* 가 표시 됨을 알 수 있다
실제 int* 는 원 value 의 byte 를 4 바이트로 알고 있는만큼 그만큼의 값을 표시하고 알게 된다
컴파일 오류를 제외하고 실행 했을 때의 결과
char > int 로의 캐스팅의 경우 실제 값에 대한 출력이 정상적이지 못하며
반대의 int > char 의 경우 더 큰 사이즈에서 자은 사이즈로의 바이트 변환이기 때문에 정상적인 코드 처럼? 보인다

실제로 아래 두가지 케이스의 경우 c++ style 의 static_cast 를 사용 하며 서로 casting 될수없는 혹은 캐스팅 될수 있더라도 문제될 수 있을 경우 컴파일 오류를 출력한다

컴파일 타임에 문제를 발견할 수 있다

만약 의도한 코드라면 int > char 의 경우 정상적일 가능성이 매우 적을 것이고 반대의 경우 char 의 사이즈 보다큰 값을 갖고 있을때는 의도와 다른값을 갖게 될 수 있다

가급적이면 c++ 에서는 c++ style 의 casting 을 사용하도록 하자
물론- casting 하지 않는 필요 없는 코드가 더 좋지만….

c++ style cast 의 장점
캐스팅 이 있던 코드를 찾는데 더 수월하다
잘못된 캐스팅을 컴파일 타임에 알 수 있다
dynamic_cast 의 경우 RTTI 를 거친 상태로 결과가 나오므로 잘못된 casting 의 경우 런타임에 리턴 값으로 해당 결과를 예외처리 가능

단점
코드가 좀 길어진다
억지로 값을 다운 캐스팅 해서 의도적으로 사용하려면 불가능하다
c style 캐스팅에 익숙한경우 귀찮을 수 있다
dynamic_cast 의 경우 내부적으로 타입 연산에 비용이 발생한다


댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다