항목 27 : 캐스팅은 절약, 또 절약! 잊지 말자
이번 항목에서는 캐스팅에 대해 소개해보도록 하겠습니다.
일단 캐스팅 문법 정리부터 시작하도록 하겠습니다. 똑같은 캐스트인데 쓰는 방법이 세 가지나 있습니다.
우선 C 스타일의 캐스트입니다.
(T) 표현식 // 표현식 부분을 T 타입으로 캐스팅합니다.
다음은 함수 방식 캐스트입니다.
T (표현식) // 표현식 부분을 T 타입으로 캐스팅합니다.
이 두 형태를 통틀어 '구형 스타일의 캐스트'라고 부르겠습니다.
C++는 네 가지로 이루어진 새로운 형태의 캐스트 연산자를 독자적으로 제공합니다(신형 스타일의 캐스트 혹은 C++ 스타일의 캐스트 라고 부르죠)
const_cast<T>(표현식)
dynamic_cast<T>(표현식)
reinterpret_cast<T>(표현식)
static_cast<T>(표현식)
각 연산자는 나름대로의 목적이 있습니다.
const_cast : 객체의 상수성을 없애는 용도로 사용됩니다. 이런기능을 가진 C++ 스타일의 캐스트는 이것밖에 없습니다.
dynamic_cast : '안전한 다운캐스팅'을 할 때 사용하는 연산자입니다. 즉, 주어진 객체가 어떤 클래스 상속 계통에 속한 특정 타입인지 아닌지를 결정하는 작업에 쓰입니다.
reinterpret_cast : 포인터를 int로 바꾸는 등의 하부 수준 캐스팅을 위해 만들어진 연산자입니다. 이것의 적용 결과는 구현환경에 의존적입니다(이식성이 없다는 뜻입니다).
static_cast : 암시적 변환을 강제로 진행할 때 사용합니다. 상수 객체 -> 비상수 객체로 캐스팅하는데는 사용 불가능.
구형 스타일의 캐스트 보다는 신형 스타일의 캐스트를 쓰는 것이 바람직합니다.
첫째, 코드를 읽을 때 알아보기가 쉽습니다, 문제가 생겼을 시 어디에서 C++의 타입 시스템이 망가졌는지를 찾아보는 작업이 편해집니다.
둘째, 캐스트를 사용한 목적을 더 좁혀서 지정하기 때문에 컴파일러 쪽에서 사용 에러를 진단할 수 있습니다.
dynamic_cast는 그 설계부터 말도 많고 탈도 많은 연산자입니다. 상당수의 구현환경에서 이 연산자가 정말 느리게 구현되어 있다는 문제 정도만 알고 있으면 될것 같습니다. 수행 성능에 사활이 걸린 코드라면 dynamic_cast에 주의를 놓지 말아야 할 것입니다.
정말 잘 작성된 C++ 코드는 캐스팅을 거의 쓰지 않습니다. 하지만 캐스팅을 사용해야 되게 된다면, 캐스팅을 해야 하는 코드는 내부 함수 속에 몰아 놓고, 그 안에서 일어나는 일들은 이 함수를 호출하는 외부에서 알 수 없도록 인터페이스로 막아두는 형식으로 해결하는게 좋습니다.
꼭 잊지 말아야 할 것!
1. 다른 방법이 가능하다면 캐스팅은 피하십시오. 특히 수행 성능에 민감한 코드에서 dynamic_cast는 몇 번이고 다시 생각하십시오. 설계 중에 캐스팅이 필요해졌다면, 캐스팅을 쓰지 않는 다른 방법을 시도해 보십시오.
2. 캐스팅이 어쩔 수 없이 필요하다면, 함수 안에 숨길 수 있도록 해 보십시오. 이렇게 하면 최소한 사용자는 자신의 코드에 캐스팅을 넣지 않고 이 함수를 호출할 수 있게 됩니다.
3. 구형 스타일의 캐스트를 쓰려거든 C++ 스타일의 캐스트를 선호하십시오. 발견하기도 쉽고, 설계자가 어떤 역할을 의도했는지가 더 자세하게 드러납니다.
'언어 > C++' 카테고리의 다른 글
[Effective C++] 예외 안전성이 확보되는 그날 위해 싸우고 또 싸우자! (0) | 2020.01.29 |
---|---|
[Effective C++] 내부에서 사용하는 객체에 대한 '핸들'을 반환하는 코드는 되도록 피하자 (0) | 2020.01.28 |
[Effective C++] 변수 정의는 늦출 수 있는 데까지 늦추는 근성을 발휘하자 (0) | 2020.01.26 |
[Effective C++] 예외를 던지지 않는 swap에 대한 지원도 생각해 보자 (0) | 2020.01.25 |
[Effective C++] 타입 변환이 모든 매개변수에 대해 적용되어야 한다면 비멤버 함수를 선언하자 (0) | 2020.01.24 |
항목 27 : 캐스팅은 절약, 또 절약! 잊지 말자
이번 항목에서는 캐스팅에 대해 소개해보도록 하겠습니다.
일단 캐스팅 문법 정리부터 시작하도록 하겠습니다. 똑같은 캐스트인데 쓰는 방법이 세 가지나 있습니다.
우선 C 스타일의 캐스트입니다.
(T) 표현식 // 표현식 부분을 T 타입으로 캐스팅합니다.
다음은 함수 방식 캐스트입니다.
T (표현식) // 표현식 부분을 T 타입으로 캐스팅합니다.
이 두 형태를 통틀어 '구형 스타일의 캐스트'라고 부르겠습니다.
C++는 네 가지로 이루어진 새로운 형태의 캐스트 연산자를 독자적으로 제공합니다(신형 스타일의 캐스트 혹은 C++ 스타일의 캐스트 라고 부르죠)
const_cast<T>(표현식)
dynamic_cast<T>(표현식)
reinterpret_cast<T>(표현식)
static_cast<T>(표현식)
각 연산자는 나름대로의 목적이 있습니다.
const_cast : 객체의 상수성을 없애는 용도로 사용됩니다. 이런기능을 가진 C++ 스타일의 캐스트는 이것밖에 없습니다.
dynamic_cast : '안전한 다운캐스팅'을 할 때 사용하는 연산자입니다. 즉, 주어진 객체가 어떤 클래스 상속 계통에 속한 특정 타입인지 아닌지를 결정하는 작업에 쓰입니다.
reinterpret_cast : 포인터를 int로 바꾸는 등의 하부 수준 캐스팅을 위해 만들어진 연산자입니다. 이것의 적용 결과는 구현환경에 의존적입니다(이식성이 없다는 뜻입니다).
static_cast : 암시적 변환을 강제로 진행할 때 사용합니다. 상수 객체 -> 비상수 객체로 캐스팅하는데는 사용 불가능.
구형 스타일의 캐스트 보다는 신형 스타일의 캐스트를 쓰는 것이 바람직합니다.
첫째, 코드를 읽을 때 알아보기가 쉽습니다, 문제가 생겼을 시 어디에서 C++의 타입 시스템이 망가졌는지를 찾아보는 작업이 편해집니다.
둘째, 캐스트를 사용한 목적을 더 좁혀서 지정하기 때문에 컴파일러 쪽에서 사용 에러를 진단할 수 있습니다.
dynamic_cast는 그 설계부터 말도 많고 탈도 많은 연산자입니다. 상당수의 구현환경에서 이 연산자가 정말 느리게 구현되어 있다는 문제 정도만 알고 있으면 될것 같습니다. 수행 성능에 사활이 걸린 코드라면 dynamic_cast에 주의를 놓지 말아야 할 것입니다.
정말 잘 작성된 C++ 코드는 캐스팅을 거의 쓰지 않습니다. 하지만 캐스팅을 사용해야 되게 된다면, 캐스팅을 해야 하는 코드는 내부 함수 속에 몰아 놓고, 그 안에서 일어나는 일들은 이 함수를 호출하는 외부에서 알 수 없도록 인터페이스로 막아두는 형식으로 해결하는게 좋습니다.
꼭 잊지 말아야 할 것!
1. 다른 방법이 가능하다면 캐스팅은 피하십시오. 특히 수행 성능에 민감한 코드에서 dynamic_cast는 몇 번이고 다시 생각하십시오. 설계 중에 캐스팅이 필요해졌다면, 캐스팅을 쓰지 않는 다른 방법을 시도해 보십시오.
2. 캐스팅이 어쩔 수 없이 필요하다면, 함수 안에 숨길 수 있도록 해 보십시오. 이렇게 하면 최소한 사용자는 자신의 코드에 캐스팅을 넣지 않고 이 함수를 호출할 수 있게 됩니다.
3. 구형 스타일의 캐스트를 쓰려거든 C++ 스타일의 캐스트를 선호하십시오. 발견하기도 쉽고, 설계자가 어떤 역할을 의도했는지가 더 자세하게 드러납니다.
'언어 > C++' 카테고리의 다른 글
[Effective C++] 예외 안전성이 확보되는 그날 위해 싸우고 또 싸우자! (0) | 2020.01.29 |
---|---|
[Effective C++] 내부에서 사용하는 객체에 대한 '핸들'을 반환하는 코드는 되도록 피하자 (0) | 2020.01.28 |
[Effective C++] 변수 정의는 늦출 수 있는 데까지 늦추는 근성을 발휘하자 (0) | 2020.01.26 |
[Effective C++] 예외를 던지지 않는 swap에 대한 지원도 생각해 보자 (0) | 2020.01.25 |
[Effective C++] 타입 변환이 모든 매개변수에 대해 적용되어야 한다면 비멤버 함수를 선언하자 (0) | 2020.01.24 |