C++에서 캐스팅을 왜 절약해야 하는지 알아가기 전에 우선 알아야 할것은 C++ 스타일식 캐스팅 변환을 왜 해야 하는지 부터 알아야 한다.
기존의 C스타일의 캐스팅은 (T)표현식, T(표현식), 이렇게 사용 했었지만, 이것을 C++에선 '구형 스타일 캐스트' 라고 불린다.
C++에서는 새로운 캐스팅 변환은, const_cast<T>(표현식), dynamic_cast<T>(표현식), reinterpret_cast<T>(표현식), static_cast<T>(표현식) 등이 있다. 각각의 중요한점만 말한다면,
const_cast 는 객체에 걸려있는 상수성을 없애는데 사용 한다.
dynamic_cast 는 상속 계통으로의 캐스팅을 '확인'해 가면서 캐스팅을 해주며, 이것으로 인항 많은 비용을 지불하는 캐스팅 연산자이다.
reinterpret_cast 는 포인터를 int로 바꾸거나 등 하부 수준 코드에서 사용 가능하지만, 적용 결과가 구현환경에 의존적이라고 한다.
static_cast int --> double 로 또는 void*를 일반 타입 포인터로, 기본 클래스의 포인터를 파생 클래스의 포인터로 바꾸는 용도로 사용 된다.
.. 자.. C++ 스타일의 캐스팅 변환을 알아 보았지만, 왜 이것을 써야 하는지 아리송 할수가 있을것이다. 그 이유를 찾아 본다면,
첫째, 코드를 읽을 때 알아보기가 쉽다.(grep등이 쉽다는 점)
둘째, 캐스트 사용 목적을 좀 더 좁혀서 지정하기 때문에, 컴파일 타임에서 에러를 유도 할수 있다.
둘째 이유로 인해, 컴파일 타임에 캐스팅이 일어난다고 생각 하겠지만, 런타임중 캐스팅 변환이 일어난다. 또한 캐스팅 변환은 많은 벌레를 키우는 더러운 환경을 조성하게 되므로, 되도록 사용하지 않다고 필자는 타일르고 있다..(쓰지마~~)
캐스팅에 대해서 긴 이야기가 있지만, 캐스팅 변환은 새로운 임시 객체를 만든다는 것, dynamic_cast의 경우 많은 비용을 지불해야 한다는것(strcmp로 '확인' 하기 때문이기도 하다) 을 알면 좋을듯 싶다.
이것만은 잊지 말자!
1. 다른 방법이 가능하다면 캐스팅은 피하라.
2. 캐스팅이 어쩔수 없이 필요하다면, 함수안에 숨켜라.
3. 구형 새트일 캐스팅을 쓰려거든 C++ 스타일을 사용 하라
기존의 C스타일의 캐스팅은 (T)표현식, T(표현식), 이렇게 사용 했었지만, 이것을 C++에선 '구형 스타일 캐스트' 라고 불린다.
C++에서는 새로운 캐스팅 변환은, const_cast<T>(표현식), dynamic_cast<T>(표현식), reinterpret_cast<T>(표현식), static_cast<T>(표현식) 등이 있다. 각각의 중요한점만 말한다면,
const_cast 는 객체에 걸려있는 상수성을 없애는데 사용 한다.
dynamic_cast 는 상속 계통으로의 캐스팅을 '확인'해 가면서 캐스팅을 해주며, 이것으로 인항 많은 비용을 지불하는 캐스팅 연산자이다.
reinterpret_cast 는 포인터를 int로 바꾸거나 등 하부 수준 코드에서 사용 가능하지만, 적용 결과가 구현환경에 의존적이라고 한다.
static_cast int --> double 로 또는 void*를 일반 타입 포인터로, 기본 클래스의 포인터를 파생 클래스의 포인터로 바꾸는 용도로 사용 된다.
.. 자.. C++ 스타일의 캐스팅 변환을 알아 보았지만, 왜 이것을 써야 하는지 아리송 할수가 있을것이다. 그 이유를 찾아 본다면,
첫째, 코드를 읽을 때 알아보기가 쉽다.(grep등이 쉽다는 점)
둘째, 캐스트 사용 목적을 좀 더 좁혀서 지정하기 때문에, 컴파일 타임에서 에러를 유도 할수 있다.
둘째 이유로 인해, 컴파일 타임에 캐스팅이 일어난다고 생각 하겠지만, 런타임중 캐스팅 변환이 일어난다. 또한 캐스팅 변환은 많은 벌레를 키우는 더러운 환경을 조성하게 되므로, 되도록 사용하지 않다고 필자는 타일르고 있다..(쓰지마~~)
캐스팅에 대해서 긴 이야기가 있지만, 캐스팅 변환은 새로운 임시 객체를 만든다는 것, dynamic_cast의 경우 많은 비용을 지불해야 한다는것(strcmp로 '확인' 하기 때문이기도 하다) 을 알면 좋을듯 싶다.
이것만은 잊지 말자!
1. 다른 방법이 가능하다면 캐스팅은 피하라.
2. 캐스팅이 어쩔수 없이 필요하다면, 함수안에 숨켜라.
3. 구형 새트일 캐스팅을 쓰려거든 C++ 스타일을 사용 하라
'책 정리 > Effective C++ 3판' 카테고리의 다른 글
항목 32: public 상속 모형은 반드시 "is-a(...는 ...의 일종이다)"를 따르도록 만들자. (0) | 2008.07.02 |
---|---|
항목 31: 파일 사이의 컴파일 의존성을 최대로 줄이자 (0) | 2008.07.02 |
항목 30: 인라인 함수는 미주알고주알 따져서 이해해 두자 (0) | 2008.07.01 |
항목 29: 예외 안전성이 확보되는 그날 위해 싸우고 또 싸우자! (0) | 2008.07.01 |
항목 28: 내부에서 사용하는 객체에 대한 '핸들'을 반환하는 코드는 되도록 피하자. (0) | 2008.06.28 |
항목 26: 변수 정의는 늦출 수 있는 데까지 늦추는 근성을 발휘하자. (0) | 2008.06.25 |
항목 25: 예외를 던지지 않는 swap에 대한 지원도 생각해 보자 (0) | 2008.06.24 |
항목 24: 타입 변환이 모든 매개변수에 대해 적용되어야 한다면 비멘버 함수를 선언하자 (0) | 2008.06.15 |
항목 23: 멤버 함수보다는 비멤버 비프렌드 함수와 더 가까워지자. (0) | 2008.06.07 |
항목 22: 데이터 멤버가 선언될 곳은 private 영역임을 명심하자 (0) | 2008.06.07 |
최근댓글