C++에서 타입 변환을 수행할 때 사용하는 연산자들이 있습니다. 타입 안전성과 코드의 명확성을 유지하는 데 도움을 줍니다. 타입변환을 수행하지만, 변환이 합법적인지 검사하지 않습니다. 주로 기본형 타입 변환, 클래스 타입 변환 등에서 사용됩니다.
static_cast는 컴파일 타임에 타입 변환을 수행할 때 사용하는 연산자입니다. 이 연산자는 다음과 같은 상황에서 사용됩니다
/** static_cast
타입 변환을 수행하지만, 변환이 합법적인지 검사하지 않습니다.
주로 기본형 타입 변환, 클래스 타입 변환 등에서 사용됩니다.
*/
{
// 기본형 타입간 변환
{
int i = 10;
float f = static_cast<float>(i);
}
// 포인터 참조 간 변환
{
/*
상속 관계에 있는 클래스 간의 변환 등.
static_cast 는 안전성을 검사하지 않지만, 타입 시스템에 따라 합법적인 변환을 보장합니다.
*/
class Base {};
class Derived : public Base {};
Base* basePtr = new Derived();
Derived* derivedPtr = static_cast<Derived*>(basePtr);
}
// 열거형 간 변환
{
enum Color { RED, GREEN, BLUE };
int colorValue = static_cast<int>(RED);
}
// 사전정의된 타입 변환
{
// 타입에 대한 컴파일 타임 체크를 수행합니다.
// 예시 없음
}
const_cast 는 객체의 const 또는 volatile 속성을 제거하거나 추가 할 때 사용합니다. 이 연산자는 상수성(constness) 를 변경하는 데 유용합니다. const 제거는 주의해서 사용해야 하며, 원래 객체의 속성과 일치하지 않으면 정의되지 않은 동작이 발생할 수 있습니다.
const 로 선언된 객체를 const 가 아닌 객체로 변환합니다.이는 객체의 값을 변경할 수 있게 해주지만, 원래 const 로 선언된 객체에 대해 이렇게 하는 것은 위험할 수 있으며, 프로그램의 정의되지 않은 동작을 초래할 수 있습니다.
// const 를 제거하는 예시
void modify(int* ptr){
*ptr = 5;
}
void example(){
const int a = 10;
modify(const_cast<int*>(&a));
}
변수를 const 로 변환할 수 있습니다. 이경우 원래 변수가 const 로 선언되어야 하며, 그렇지 않으면 정의되지 않은 동작이 발생할 수 있습니다.
int value = 10;
const int* ptr = const_cast<const int*>(&value);
주로 런타임에 안전성을 보장하는 데 사용됩니다. 이 연산자는 주로 다형성(polymorphism) 을 사용하는 경우에 사용됩니다.
class Base{
public:
virtual ~Base(){}
};
class Derived : public Base {};
void example(Base* basePtr){
Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);
if(derivedPtr){
// 변환성공
}
else{
// 변환실패
}
}
이 예제에서는 Base 클래스 포인터를 Derived 포인터로 안전하게 변환하려고 합니다.
낮은 수준의 타입 변환을 수행하는 데 사용됩니다. 타입 안정성을 보장하지 않습니다. 이 연산자는 매우 강력하며 주의해서 사용해야 합니다.
// int 를 char 로 변환하여 메모리의 비트패턴을 그대로 해석합니다.
int i = 65; // -> 0000 0000 0000 0000 0000 0000 0100 0001 (2)
char* c = reinterpret_cast<char*>(&i);
std::cout << *c << std::endl; // 출력 A ( 정수 65 는 ASCII 코드에서 A 에 해당 )