C++

Casting (Static, Dynamic, Reinterpret )

춤추는수달 2023. 3. 28. 06:06

C++의 캐스터는 static_cast, dynamic_cast, reinterpret_cast 세 가지 종류가 있다. 각 캐스터는 약간씩 다른 방식으로 동작하고, 제약사항도 다르다. 따라서 상황마다 적절한 캐스터를 사용해 주어야 한다. 그럼 각 캐스터의 특징, 사용하면 좋은 상황 등을 알아보자. 

미리 3줄요약:

static_cast : 기초 < - > 유도, 기본 자료형 캐스팅

dynamic_cast: 기본적으로 유도 - > 기초 캐스팅. virtual함수 있으면 유도 < - > 기초 캐스팅. 런타임에 안정성 검사.

reinterpret_cast : 포인터, 포인터 관련 형 변환 모두 허용.


static_cast

static_cast는 기본 자료형의 캐스팅, 그리고 기초 클래스와 유도 클래스의 포인터 및 참조형 의 캐스팅을 다룬다. 만약 서로 관계(상속)가 없는 클래스끼리 캐스팅을 한다면 컴파일 에러를 일으킨다.

static_cast는 안정성 검사를 하지 않는다. 유도 클래스에서 기초 클래스 형으로의 캐스팅은 안전하지만, 기초 클래스에서 유도 클래스형으로의 캐스팅은 주의가 필요하다. static_cast는 이에 대한 책임을 사용자에게 넘긴다. 즉, 쓰는 사람이 알아서 조심히 쓰라는 말이다.

dynamic_cast

dynamic_cast는 클래스에 대한 포인터 및 참조형만 다룬다. 기본적으로는 유도 클래스를 기초 클래스로 캐스팅할 수 있다. 그러나 만약 두 클래스의 상속 관계에 virtual 함수가 있다면 기초 클래스를 유도 클래스로 캐스팅 할 수도 있다. 

dynamic_cast는 static_cast와 달리 런타임안정성 검사를 검사한다. 때문에 static_cast보다 동작 속도가 느리지만, 안전한 캐스팅을 할 수 있다.

ChatGPT에게 물어본 결과, dynamic_cast가 포인터 형만 다루는 이유는, dynamic_cast가 런타임에 타입 정보가정해지는 것들만 캐스팅이 가능하도록 만들어졌기 때문이라고 한다. 포인터 형은 메모리 주소를 담고있고, 이 주소에 담긴 내용의 타입은 실제로 메모리에 접근하여 읽거나 쓸때 결정된다고 한다.

reinterpret_cast

reinterpret_cast는 dynamic, static_cast와 달리 상속관계가 없어도 캐스팅이 가능하다. 또한 꼭 클래스의 포인터 혹은 참조형일 필요가 없다.

포인터를 대상으로 하는, 그리고 포인터와 관련이 있는 모든 유형의 형 변환을 허용한다. 즉 포인터 형이거나 주소 값을 담고있는 변수 사이는 모두 형 변환을 해주는 것이다.

'C++' 카테고리의 다른 글

가상함수  (2) 2024.04.12
헷갈리는 C++ 질문들  (0) 2024.04.12
스마트 포인터  (0) 2022.03.29
순환문제  (0) 2022.03.28
STL 컨테이너별 간략 특징 정리  (0) 2022.02.21