본문 바로가기
Programming/열혈 C++ 프로그래밍(저자 윤성우)

Ch 16. C++의 형 변환 연산자

by minjunkim.dev 2020. 8. 18.

    모든 내용은 [윤성우 저, "열혈 C++ 프로그래밍", 오렌지미디어] 를 기반으로 제 나름대로 이해하여 정리한 것입니다. 다소 부정확한 내용이 있을수도 있으니 이를 유념하고 봐주세요!


# C 스타일의 형 변환 연산자는 C언어의 호환성을 위해 존재하며,

이는 너무 강력하여 잘못된 형 변환을 하여도 컴파일러가 잡아내지 못하는 경우가 있다.

# C++의 형 변환 연산자
1) dynamic_cast : 상속관계에서의 안전한 형변환
- dynamic_cast<포인터형 or 참조형>(변환대상)
- 유도 클래스의 포인터 및 참조형 데이터를,
기초 클래스의 포인터 및 참조형 데이터로 형 변환하는 경우만 허용한다.

2) static_cast : 상속관계에서
유도 클래스 => 기초 클래스 로의 형 변환 뿐만 아니라(dynamic_cast),
기초 클래스 => 유도 클래스 로의 형 변환 또한 허용한다.
+ 기본 자료형 데이터 간의 형 변환에도 사용한다.

# dynamic_cast를 통해 안전성을 높여야 하며, 제한적으로 static_cast를 사용하자.
그러나, static_cast는 실행 중에 안전 검사를 별도로 진행하지 않아서(static),

안정성을 보장하지 않으나 실행 속도는 더 빠르다.

 

# dynamic_cast는 컴파일 시간이 아닌 실행 시간(dynamic)에
안정성을 검사하도록 컴파일러가 바이너리 코드를 생성한다.
그래서 실행 속도는 느리지만, 그만큼 안정적인 형변환이 가능하다.


3) const_cast : const의 성향을 삭제한다.
- 포인터와 참조자의 const 성향을 제거하는 형 변환
- volatile(컴파일러 최적화 제한) 성향 제거에도 사용

 

# const char*에 char* 대입은 안되지만, 그 반대의 경우는 가능하다.

4) reinterpret_cast : 포인터를 대상으로 하는, 그리고 포인터와 관련이 있는 모든 유형의 형 변환에 사용한다.
+ 상관없는 자료형으로의 형 변환에도 사용한다.

# dynamic_cast 연산자도 상속관계에 있을 때,
기초 클래스가 Polymorphic 클래스(하나 이상의 가상함수를 지니는 클래스)라면,
e.g) 추상클래스(하나 이상의 순수가상함수)
static_cast 처럼 기초 클래스 => 유도 클래스 로의 형 변환을 허용한다.
단, 변환된 유도 클래스 포인터가 실제로 유도 클래스 객체를 가리키는, 논리적으로 맞는 경우에만 허용한다.
안 맞으면 널 포인터를 반환한다.(안정적인 형변환)

# 참조자인 경우에는 null을 반환할 수 없으므로 bad_cast 예외가 발생한다.
따라서, 참조형을 대상으로 dynamic_cast 진행할 경우,

bad_cast 예외가 발생할 수 있으므로 이에 대한 예외처리가 반드시 필요하다.

# bad_cast는 dynamic_cast 연산자를 이용한 형 변환 과정에서 발생할 수 있는 에러이다.

# new 연산자에 의해서 발생하는 예외
new에 의해 메모리 할당 실패시, 헤더파일 <new>의 bad_alloc 예외객체가 발생한다.


[출처] : 윤성우 저, "열혈 C++ 프로그래밍", 오렌지미디어