TIL
static_cast<>의 dynamic_cast<>는 모두 형변환 연산자로서 사용된다. 하지만 상황에 따라 다르게 사용된다.
먼저, static_cast<>의 경우 책("이것이 c++이다")에서 컴파일 시 상향 혹은 하향 변환한다고 설명되어 있는데 여기서 말하는 상향 혹은 하향 변환은 다른말로 업캐스팅과 다운캐스팅을 뜻한다. 업캐스팅이 될 때
반면에, dynamic_cast<>의 경우 런타임 시 상향 혹은 하향 변환한다고 설명되어 있다.
위 두 형변환 연산자의 역할은 같으나 호출되는 시점이 다르다는 것을 알 수 있다.
일단 이 둘의 호출 시점의 차이에 대해 알아보기 전에 이러한 형변환 연산자가 왜 필요한 것일까를 생각해보자.
기본적으로 상속 관계에서 업캐스팅이 이루어질 때 묵시적 형변환이 이루어지는데 왜 static_cast<>로 명시적으로 형변화을 해주어야 할까?
다운캐스팅 때문에 형변환 연산자를 사용한 명시적 형변환이 필요하다.
일반적으로 업캐스팅은 묵시적 형변환으로 진행되어도 파생 클래스 객체가 부모 클래스 객체의 일종이기 때문에 문제가 없지만 다운캐스팅의 경우 기본 클래스의 타입으로 참조된 객체가 파생된 클래스의 타입일때 파생 클래스 객체의 형을 파생된 클래스의 형으로 static_cast<>를 이용하여 명시적으로 형변환을 해야한다.
그런데 만약 다운캐스팅을 할 때 기본 클래스의 포인터나 참조가 실제로 가리키는 객체가 파생 클래스의 객체임을 보장할 수 없을 때, 이때 dynamic_cast 연산자를 사용하여 런타임에 형변환을 수행하는 것이다.
밑에 글은 chat GPT의 설명인데 위의 부족한 점들을 메꾸기 충분할거 같다.
static_cast와 dynamic_cast는 모두 형변환 연산자로 사용됩니다. 그러나 static_cast는 컴파일 시점에 처리되고, dynamic_cast는 런타임 시점에 처리됩니다. 이 때문에 static_cast는 컴파일러가 실행 가능한 코드를 생성할 때 발생하고, dynamic_cast는 런타임 환경에서 실행 시 발생합니다.
또한, static_cast는 기본 데이터 형식 간에 변환하거나 상속 계층 구조 내에서 포인터 또는 참조를 변환하는 데 사용됩니다. dynamic_cast는 기본 데이터 형식 간의 변환에는 사용할 수 없으며, 상속 계층 구조에서 포인터 또는 참조를 변환하는 데 사용됩니다.
마지막으로, static_cast로 다운캐스팅을 수행하면 안전하지 않을 수 있으며, 이 경우 dynamic_cast를 사용해야합니다. dynamic_cast는 실행 시점에 해당 객체가 실제로 해당 파생 클래스의 인스턴스인지 확인하므로 안전합니다.
참고로 dynamic_cast는 꼭 필요한 경우가 아니라면 dynamic_cast를 사용해서는 안된다. 성능을 떨어뜨리는 주범이며 코드를 복잡하게 잡아 늘리기도 하기 때문이다.