공부/C++

static_cast와 dynamic_cast의 개념 및 차이점

셩잇님 2023. 1. 10. 18:45
반응형

 

 

1. static_cast

static_cast는 한 유형에서 다른 유형으로 유형 변환을 수행하는 C++ 연산자입니다.

 

static_cast의 기본 구문은 다음과 같습니다. 여기서 new_type은 변환하려는 유형이고 original_value는 변환하려는 값입니다.

new_type new_value = static_cast<new_type>(original_value);

 

static_cast는 아래 서술한 상황과 같이 다양한 유형 변환을 수행하는 데 사용할 수 있습니다.
1. int에서 float로 또는 double에서 int로의 기본 유형 간 변환
2. char*와 같은 포인터 유형을 void*로 변환합니다.
3. 파생 클래스 포인터에 대한 기본 클래스 포인터와 같은 관련 클래스 간 변환.


static_cast는 "최선의" 작업입니다. 변환이 안전하고 잘 정의되어 있다고 확신할 때 유형 변환을 수행하는 데 사용됩니다. 그러나 런타임에 변환이 실제로 안전한지 확인하지 않으며 그렇지 않은 경우 컴파일 오류를 생성합니다.

 

예를 들어 다음 예제는 오류 없이 컴파일됩니다.

class A {};
class B : public A {};

B* b = new B;
A* a = static_cast<A*>(b);

이 예에서 b는 B 개체에 대한 포인터이고 a는 b에서 변환된 A 개체에 대한 포인터입니다. B는 A에서 파생되기 때문에 이 변환은 안전하고 잘 정의되어 있습니다.

그러나 다음 예제는 컴파일 오류가 생성됩니다.

class C {};

C* c = new C;
A* a = static_cast<A*>(c);

여기서 C와 A는 서로 관련이 없는 클래스이므로 이 변환은 안전하지 않으며 컴파일되지 않습니다.

요약하면 static_cast는 변환이 안전하다고 확신할 때 유형 변환을 수행하는 빠르고 효율적인 방법이지만 런타임에 변환이 실제로 안전한지 확인하지는 않습니다. 컴파일 타임 유형 검사만 수행하며 변환이 안전하지 않은 경우 오류를 생성합니다.

 

 


 

 

2. dynamic_cast

dynamic_cast는 런타임에 유형 변환을 수행하는 C++ 연산자입니다. 컴파일 타임에 원래 값의 유형을 알 수 없거나 변환이 안전하지 않고 잘 정의되지 않은 경우 값을 한 유형에서 다른 유형으로 변환하는 데 사용됩니다. dynamic_cast를 사용하기 위한 기본 구문은 다음과 같습니다.

 

new_type* new_value = dynamic_cast<new_type*>(original_value);

여기서 new_type은 변환하려는 유형이고 original_value는 변환하려는 값입니다. dynamic_cast의 결과는 새 유형에 대한 포인터입니다. 원래 값의 유형이 새 유형의 공개 기반이 아닌 경우 dynamic_cast의 결과는 널 포인터입니다.

dynamic_cast는 기본 클래스에 대한 포인터나 참조가 있고 이를 파생 클래스로 변환하려는 경우에 주로 사용됩니다. 적어도 하나의 가상 함수가 있는 클래스에 대한 포인터 및 참조와 함께만 사용할 수 있다는 점에 유의하는 것이 중요합니다.

 

class A { virtual void f() {} };
class B : public A {};
class C : public A {};

A* a = new B;
B* b = dynamic_cast<B*>(a);  // Returns a pointer to B
C* c = dynamic_cast<C*>(a);  // Returns a null pointer

위의 예에서 a는 A 유형의 개체에 대한 포인터이지만 실제로는 B 유형의 개체를 가리킵니다. dynamic_cast 연산자는 a를 B 유형의 포인터로 변환하는 데 사용되며, 이는 성공하므로 b는 가리킬 것입니다. 그러나 a가 C 유형의 객체를 가리키지 않기 때문에 a에서 C 유형의 포인터로의 캐스트는 실패합니다. 이 경우 결과는 널 포인터입니다.

포인터가 가리키는 객체가 올바른 유형인지 런타임에 확인해야 하므로 dynamic_cast가 static_cast보다 상대적으로 느리다는 점도 주목할 가치가 있습니다.

요약하면 dynamic_cast는 원래 값의 유형이 컴파일 시간에 알려지지 않거나 변환이 안전하지 않고 잘 정의되지 않은 경우 유형 변환을 수행하는 데 사용됩니다. 캐스트가 유효한지 확인하고 캐스트가 유효하지 않은 경우 널 포인터를 리턴하는 런타임 조작입니다. static_cast보다 덜 효율적이지만 런타임에 유형 검사를 수행하여 static_cast에 없는 수준의 안전성을 제공합니다.

 

 


 

 

3. static_cast와 dynamic_cast의 차이점

static_cast와 dynamic_cast의 주요 차이점은 static_cast는 컴파일 타임에 수행되는 반면 dynamic_cast는 런타임에 수행된다는 것입니다. 

 

이는 static_cast가 dynamic_cast보다 빠르다는 것을 의미하지만 static_cast가 컴파일 타임에 안전한 변환만 수행할 수 있음을 의미하기도 합니다. static_cast는 사용 시 변환이 올바르게 이뤄지지 않는다면 컴파일 타임 오류가 발생합니다. 반면 dynamic_cast는 컴파일 시간에 안전하지 않은 변환을 수행할 수 있지만, 런타임에 검사를 수행해야 하므로 static_cast보다 속도가 느립니다.

 

 

반응형