블로그는 나의 힘!
[ Programing ]/C++2010. 2. 4. 20:56

 unsigned char* szIdentity       = new unsigned char[MAX_SIZE];
 unsigned char* szComparison = new unsigned char[MAX_SIZE];
 
 // strncmp 2개 문자열을 대소(높고 낮음) 비교. ( strcmp 대소문자 구분 없이 비교. )
 // Argument1 < Argument2 경우     음수 리턴
 // Argument1 = Argument2 경우         0  리턴
 // Argument1 > Argument2 경우     양수 리턴
 // strncmp( const char*, const char*, size_t )
 if( strncmp( reinterpret_cast< const char* >( szIdentity ), 
                 reinterpret_cast< const char* >( szComparison ), 
                 sizeof( unsigned char ) *MAX_SIZE ) != 0 )
 {  
     return false;
 }

================================================================

reinterpret_cast 정의
- 비 표준형 변환
- 포인터끼리, 포인터와 수치형간의 변환



일단 reinterpret_cast의 정의는 위와 같다. 포인터끼리의 변환시 사용하는 캐스팅이다.
그 이전 캐스팅의 의미를 알아 보자. 지정된 형식을 강제적으로 변환 시켜 버리는 것이 바로 캐스팅의 의미.

reinterpret_cast는 포인터를 강제적으로 변환 시키는 캐스팅이라는 걸 중요하게 생각해야 한다.
reinterpret_cast도 이전에 설명한 Dynamic_cast 못지 않게 강력하다. 아니 더하면 더 했지 덜하지 않는다.
Dynamic_cast는 남발하면 클래스 구조가 엉망이 되어 나중 사태가 심각해 지는 정도라면, 이녀석은 메모리가 꼬여 버린다. 
한마디로 더 골치 아픈 케이스.

왜 포인터끼리 변환을 중요하게 생각하라는 것은, 예를 들어 long int* Data 라는 녀석을 만들어 사용했다고 하자.
이 녀석을 reinterpret_cast로 포인터 변환해 char* 형으로 바꿔 버렸다고 하자.

의미상으로는 단순히 char* 타입으로 바뀐것이지만 할당된 크기는 long int는 4바이트, char는 1바이트다. 
즉, 할당된 동적 타입의 크기가 변환이 된다는 소리. 
직설적으로 말하면 우리가 볼수 없는 메모리가 꼬여 버린다는 소리다.

위에 상황은 흔히 down_cast라고 하는데 4바이트를 1바이트 형식으로 바꾸는 것은 크게 문제 되지 않는다. 나머지 3바이트는 그냥 사용하지 않고, 낭비될 뿐이다.

하지만 반대로 up_cast 형식. 
즉, char* Data를 reinterpret_cast로 포인터 변환해 long int* 타입으로 바꿔버리면 할당된 char 1바이트가 long int로 변환해 3바이트가 추가 되어야 한다는 말이다.
할당이 되어 있는 동적 변수를 강제로 크기 변환시켜 메모리 침범이라는 엄청난 일을 벌려 버린다.



  서론이 길었는데, 위에 코드는 왜 거론 했냐고 하면 주석에 설명 되어 있는 것 처럼, 문자 비교시 사용 하는 레퍼런스 인데 문자열 인자 값을 요구 하는 것이 const char* 이다. 하지만 변수는 unsign char* 타입.
이런 경우는 변수 사이즈도 같으나 형식이 달라서 캐스팅 할 방법이 없어 강제 포인터 캐스팅이 필요한 경우 reinterpret_cast변환이 필요한 예이다.
reinterpret_cast를 사용할 때에는 단순히 포인터 변환을 한다고 무작정 사용하지 말고, 동적 할당을 왜 하였으며, 동적 할당한 타입과 사이즈가 얼마나 되는지 메모리 적으로 생각을 하고 고려를 한다음 작성 하도록 하자.



관련 링크 : Casting의 종류
Posted by Mister_Q