본문 바로가기

PL/C & C++

[C++] static_cast, reinterpret_cast

 

 

형 변환 연산자: static_cast와 reinterpret_cast의 차이

이번에는 간단하게 static_cast와 reinterpret_cast의 차이점에 대하여 알아봅니다. 실제로 이 두가지는 비...

blog.naver.com

 

 

 

 

 컴퓨터는 비트 단위로 정보를 저장합니다.1 당연히 정수 5와 실수 5.0은 엄청난 차이가 있습니다. 단순히 변환을 명령했더니 이러한 복잡한 처리를 내부에서 전부 해줍니다. 이것이 static_cast입니다.

 

 

 static_cast는 형 변환을 요청받으면 내부에서 지정된 형 변환 함수를 호출합니다. int와 float사이에도 그러한 함수가 있는 것입니다. 다음 예제를 봅시다.

 

 

 당연히 형 변환은 일어나지 않습니다. 그도 그럴것이 형 변환 함수도 없으며 어떻게 변환해야되는지 컴파일러가 알 길이 없기 때문입니다.

 

 

 이제 형 변환 함수를 지정해줍시다.

 

 

 형 변환 함수를 만들어주자 컴파일 에러가 사라졌습니다. 그리고 당연하다는 듯이 프로그램을 실행하면 5가 출력됩니다. 우리가 원하는 결과죠.

 

 결론을 내리자면 static_cast는 형 변환 함수를 호출합니다. 원하는 형 변환 함수를 호출할 뿐이며, 함수가 없으면 에러 메시지를 호출(?)합니다.

 

 reinterpret을 역시 직역하면 '재해석하다'정도가 됩니다. 정말 알맞은 이름이라고 생각합니다. 왜냐하면 이 형 변환 연산자는 말 그대로 '재해석'하게 해주거든요.

 다음 에제를 봅시다.

 

 

 분명 Num에는 5라는 데이터가 들어있습니다. 이 데이터를 그대로 pReal에 복사했습니다. 당연히 우리는 5가 출력되길 기대하고 있겠죠. 하지만 5는 절대로 출력되지 않습니다. Num에 들어있는 5라는 데이터는 int형에서 유효할 뿐이지 float형에서 5와는 전혀 관련이 없기 때문입니다.

 앞선 예제에서는 이러한 형 변환에서 적절한 데이터로 변환해 주는 역할을 함수가 다 했습니다. 하지만 이런식으로 저급(Raw-Level) 데이터 복사를 할 땐 그것을 기대할 수 없습니다. 바로 그러한 형 변환이 reinterpret_cast입니다.

 

 reinterpret_cast는 주로 포인터와 일반 자료, 포인터와 포인터 끼리의 형 변환으로 자주 사용합니다. 하지만 일반 자료형 두 개의 형 변환은 성립되지 않습니다. 함수를 호출하는 것이 아니기 때문입니다.

 static_cast는 함수를 호출하며, 변환된 결과를 임시 변수로 반환합니다. static_cast<type>(variable)이 하나의 문장은 하나의 함수라고 생각하면 될 것입니다. 임시 변수는 함수 반환과 함께 생성되며, 해당 줄에서 넘어설 경우 사라집니다. 물론 데이터는 해당 줄을 떠날 때 이미 다른 변수에 저장되어 있기에 문제는 없습니다.

 하지만 reinterpret_cast는 함수를 호출하지 않습니다. 말 그대로 "이 자료를 다음 자료형으로 인식하라!"라는 메시지를 컴파일러에게 보내는 것입니다. 다음 예제를 봅시다.

 

 

 위 memcpy를 사용한 예제와 결과는 완벽하게 동일하며, 본질적으로 보자면 코드 역시 동일합니다. Num이라는 공간에는 0101(2)라는 데이터가 들어있습니다. 이 0101(2)데이터를 그대로 float형으로 인식하여 Real에 복사합니다. 당연히 float에서 0101(2)는 5가 아닙니다. 따라서 올바르지 못한 결과를 보이는 것이며, 이는 위 memcpy예제에도 똑같이 적용됩니다. "이 변수를 <>안에 있는 자료형으로 생각해라!"라는 것이 reinterpret(재해석)의 어원이라고 생각합니다.

 

 

 이렇게, static_cast와 reinterpret_cast는 비슷한 것 같으면서도 완전히 다른 형 변환 연산자이며, 어떤 때에 어떤 연산자를 사용하여야 하는지 좀 더 정확하게 구분할 수 있게 되기를 바랍니다. 또, static_cast연산자는 연산자 오버로딩을 통하여 변환 가능한 자료형을 추가할 수 있다는 것도 알아두시면 좋습니다.