본문 바로가기
프로그래밍/C++

C++ ] static_cast와 reinterpret_cast. 그 외 const_cast, dynamic_cast

by eteo 2023. 5. 28.

 

 

 

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 포인터로 변환