C++에서 C 스타일의 캐스팅은 더 이상 권장되지 않는다. C 스타일 캐스팅은 실수할 여지가 많고 의도하지 않은 형식 변환이 발생할 수 있기 때문에 C++에서는 대신 static_cast, reinterpret_cast, const_cast, dynamic_cast와 같은 명시적인 캐스팅 연산자들을 사용하는 것을 권장한다.
1. static_cast : 정적 캐스트
- 고정된 표준 형식 변환에 사용된다.
- 상속 관계가 아닌 타입 간의 변환, 숫자형 타입 간의 변환, 포인터 간의 변환 등.
int num = 10;
double numDouble = static_cast<double>(num); // int를 double로 변환
2. reinterpret_cast : 재해석 캐스트
- 다른 타입과 포인터 사이의 비트 패턴을 재해석하는 데 사용된다.
- 포인터를 정수로 변환하거나, 정수를 포인터로 변환해야 하는 경우
- 하드웨어 레지스터에 접근하거나 다른 저수준 작업을 수행해야 할 때
- C 스타일의 캐스팅을 대체하기 위한 C++ 스타일의 캐스트 연산을 사용해야 하는 경우
int num = 10;
void* voidPtr = reinterpret_cast<void*>(&num); // int 포인터를 void 포인터로 변환
3. const_cast : 상수 제거 캐스트
- 상수성을 제거하여 변수를 상수에서 비상수로 캐스팅할 때 사용된다.
- 상수성을 제거하여 값을 수정하거나, 함수의 오버로딩 등을 처리할 때
const int num = 10;
int* numPtr = const_cast<int*>(&num); // 상수 포인터를 비상수 포인터로 변환
4. dynamic_cast : 동적 캐스트
- 상속 관계가 있는 클래스 간의 타입 변환에 사용된다.
- 런타임에 타입 검사가 이루어지며, 가상 함수 테이블(Virtual Function Table)을 사용하여 타입 정보를 확인하고, 안전한 다운캐스팅을 지원한다.
Base* basePtr = new Derived(); // 다형성을 이용한 객체 생성
Derived* derivedPtr = dynamic_cast<Derived*>(basePtr); // Base 포인터를 Derived 포인터로 변환
if (derivedPtr != nullptr)
{
// 안전한 다운캐스팅 성공
}
❗ static_cast 와 reinterpret_cast 의 차이
static_cast 를 통해 int를 double 로 변환하면 int 자료형으로 10을 의미했던 값이 IEEE-754 배정밀도 표현방식으로 바뀌어 double 변수에 들어가는 거고, reinterpret_cast 재해석 캐스트라는 말처럼 변수에 들어있는 비트패턴은 그대로고 다르게 해석하는거라고 할 수 있다.
int num = 10;
double numDouble = static_cast<double>(num); // int를 double로 변환
int num = 10;
void* voidPtr = reinterpret_cast<void*>(&num); // int 포인터를 void 포인터로 변환
'프로그래밍 > C++' 카테고리의 다른 글
C++ ] Format-Hex 명령어(Hex 덤프) 직접 구현 (0) | 2023.05.29 |
---|---|
C++ ] Manipulator와 iomanip 헤더 (0) | 2023.05.28 |
C++ ] 예외처리 try-catch (0) | 2023.05.28 |
C++ ] filesystem 라이브러리 (0) | 2023.05.28 |
C++ ] JSON 데이터 포맷, rapidjson 라이브러리 사용해 파싱 (0) | 2023.05.14 |