관리 메뉴

기억을 위한 기록들

[CPP-effective] 5-2 형변환(캐스팅/casting)은 아끼고 아끼자. 본문

C & CPP/Effective C++

[CPP-effective] 5-2 형변환(캐스팅/casting)은 아끼고 아끼자.

에드윈H 2021. 5. 6. 17:23

C 스타일의 형 변환(캐스팅)은 이렇다.

(T) 표현식 //표현식부분을 T타입으로 형변환합니다.

 

그리고 함수 방식의 형변환은 문법이 함수 호출 문 같다

T(표현식) //표현식부분을 T타입으로 형변환합니다.

 

 

위 2가지는 어떻게 쓰든 구형 스타일의 형 변환이다.

 

그리고 이제 C++에서의 형 변환은 4가지로 이루어져 있고 새로운 형태의 캐스트 연산자를 독자적으로 제공한다.

(신형 스타일 캐스트 혹은 C++ 스타일 캐스트)

 

1. 객체의 상수 성을 없애는 용도로 사용되는 형 변환.

const_cast<T>(표현식)

2.  이른바 '안전한 다운 캐스팅'을 할 때 사용하는 연산자이다.

즉, 주어진 객체가 어떤 클래스 상속 계통에 속한 특정 타입인지 아닌지를 결정하는 작업에 쓰인다.

구현 스타일의 캐스트 문법으로는 흉내 조차낼 수도 없다. 덤으로 신경 쓰일 정도로 런타임 비용이 높은 캐스팅 연산자이다.

dynamic_cast<T>(표현식)

 

3.  포인터를 int로 바꾸는 등의 하부 수준 캐스팅을 위해 만들어진 연산자로서, 적용 결과는 구현 환경에 의존적이다.(이식성이 없다는 뜻)

reinterpret_cast<T>(표현식)

 

4. 암시적 변환, int를 double로 바꾸는 등의 변환을 강제로 진행할 때 사용.

흔히들 이루어지는 타입 변환을 거꾸로 수행하는 용도

static_cast<T>(표현식)

 

 

구형 형 변환은 적법하게 쓸 수도 있지만, C++스타일 형 변환을 쓰는 게 바람직하다.

1. 코드를 읽을 때 알아보기 쉽기에, 소스 코드의 어디에서 C++의 타입 시스템이 망가졌는지를 찾아보는 작업이 편해진다.

2. 형 변환을 사용한 목적을 더 좁혀서 지정하기 때문에 컴파일러 쪽에서 사용 에러를 진단할 수 있다.

 

 

 

정리

* 다른 방법이 있다면 캐스팅(형변환)은 피하자. 특히 수행 성능에 민감한 코드에서 dynamic_cast는 몇 번이고 다시 생각하자. 설계 중에 형 변환이 필요해졌다면, 형변환을 쓰지 않는 다른 방법을 시도해보자.

* 형변환이 어쩔 수 없이 필요하다면, 함수 안에 숨길수 있도록 해보자. 이렇게 하면 최소한 사용자는 자신의 코드에 형변환을 넣지 않고 이 함수를 호출할 수 있게 된다.

* 구형 스타일의 형변환을 쓰려거든 C++ 스타일의 형변환을 선호하자. 발견하기도 쉽고, 설계자가 어떤 역할을 의도했는지가 더 자세하게 드러난다.