[C++] 형 변환 연산

2022. 1. 7. 01:29C&C++

C++로 개발할 때는, 형 변환시에 C스타일의 괄호 대신 형 변환 연산자를 사용하는 것이 바람직하다.

형 변환 연산자 컴파일 타임 런 타임
dynamic_cast 부모, 자식 관계 허용, 클래스 타입만 실제로 캐스팅 가능한지 검증
static_cast 부모, 자식 관계 허용, 원시 타입 / 클래스 타입 모두 가능 x
reinterpret_cast (=C 스타일) 모두 허용 x
const_cast const를 붙이거나 뗀다. x

 

가장 많이 사용하는 static_cast와 dynamic_cast의 차이점은

런타임에 캐스팅이 가능한지 검증을 하느냐, 마느냐다. (원시 타입 지원 여부도 다르다.)

 

dynamic_cast의 경우 컴파일 타임에는,

static_cast와 동일하게 상속관계가 있다면 오류가 나지 않는다.

그러나 런타임에 실제 저장된 객체 기준으로,

부모 -> 자식 캐스팅을 허용하지 않고, 이 경우 NULL을 반환한다.

 

그렇다면 dynamic_cast를 쓰는 이유는 뭘까?

부모(기초) 클래스의 타입으로 존재하는 자식(유도) 클래스의 객체를 자식 클래스 타입으로 변형하는 것을 허용하면서,

부모클래스 객체가 자식 클래스 타입으로 캐스팅되는 것을 막기 위해서이다.

 

동작 원리는 연산자 내부에서 실제 객체를 구분짓는것은 가상함수 테이블을 통하여 구분짓는다고 한다.

 

reinterpret_cast는 C에서 괄호로 묶어서 형변환한 결과와 일치한다.

const_cast는 const를 붙이거나 떼거나 할 때 사용한다.

 

이런 형 변환 연산자들은 각각 static_cast (8~90%), dynamic_cast(10%), reinterpret_cast / const_cast (1%) 의 빈도로 사용된다고 한다.

'C&C++' 카테고리의 다른 글

[C++] 간단한 디자인패턴  (0) 2022.01.07
[C++] 템플릿  (0) 2022.01.07
C++ 정리  (0) 2022.01.06
비트맵(.bmp) 파일 구조  (0) 2022.01.06
[C/C++] 파일 패킹  (0) 2022.01.06