메모내용

Type

Type Cast

C++에서 타입 변환을 수행할 때 사용하는 연산자들이 있습니다. 타입 안전성과 코드의 명확성을 유지하는 데 도움을 줍니다. 타입변환을 수행하지만, 변환이 합법적인지 검사하지 않습니다. 주로 기본형 타입 변환, 클래스 타입 변환 등에서 사용됩니다.

static_cast

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_cast 는 객체의 const 또는 volatile 속성을 제거하거나 추가 할 때 사용합니다. 이 연산자는 상수성(constness) 를 변경하는 데 유용합니다. const 제거는 주의해서 사용해야 하며, 원래 객체의 속성과 일치하지 않으면 정의되지 않은 동작이 발생할 수 있습니다.

const 를 제거하는 경우

const 로 선언된 객체를 const 가 아닌 객체로 변환합니다.이는 객체의 값을 변경할 수 있게 해주지만, 원래 const 로 선언된 객체에 대해 이렇게 하는 것은 위험할 수 있으며, 프로그램의 정의되지 않은 동작을 초래할 수 있습니다.

                    

// const 를 제거하는 예시
void modify(int* ptr){
    *ptr = 5;
}

void example(){
    const int a = 10;
    modify(const_cast<int*>(&a));
}
                    
                

const 를 추가하는 경우

변수를 const 로 변환할 수 있습니다. 이경우 원래 변수가 const 로 선언되어야 하며, 그렇지 않으면 정의되지 않은 동작이 발생할 수 있습니다.

                    
int value = 10;
const int* ptr = const_cast<const int*>(&value);
                    
                

dynamic_cast

주로 런타임에 안전성을 보장하는 데 사용됩니다. 이 연산자는 주로 다형성(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 포인터로 안전하게 변환하려고 합니다.

reinterpret_cast

낮은 수준의 타입 변환을 수행하는 데 사용됩니다. 타입 안정성을 보장하지 않습니다. 이 연산자는 매우 강력하며 주의해서 사용해야 합니다.

                    

// 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 에 해당 )