> [!date] published: 2022-08-06 ~~특히 06 과제에 대한 내용은 과제를 끝낸 뒤에 정리한 것이라 좀 더 간단하게 (사실은 대강) 정리한 경향이 있음...~~ ## 🌟 C++의 캐스팅 방식 C에서는 캐스팅 방식이 하나밖에 없지만, C++에서는 목적에 따라서 캐스팅 방식을 여러개로 나누어 두었다. 물론 C 스타일의 캐스팅 역시 지원하긴 하지만, 오류를 줄이고 가독성을 높이기 위해서 C++ 스타일의 캐스팅 방식을 사용하는 것이 권장된다고 한다. ### ✨ static_cast C에서의 형변환과 비슷하다. 컴파일 타임에 형변환이 가능. 그래서 왜 굳이 C의 형변환 방식을 사용하지 않고 static_cast를 사용하는 것인지에 대해서 고민을 해봤는데 내 생각에는 기능을 제한하고, 다른 성격의 목적을 갖는 캐스팅끼리 나누어서 기능을 세분화 해서 의도치 않은 결과가 나오지 않게 하기 위해서 이렇게 static_cast를 사용하는 것이 아닐까 하는 생각이 들었다. ### ✨ reinterpret_cast 포인터 타입의 자료형을 완전히 관련없는 다른 포인터 타입으로 바꾸거나(클래스 A의 포인터에 클래스 B의 포인터를 넣는 등) 포인터 타입의 자료형과 정수 타입의 변환을 하는 데에 사용한다. 정수 타입으로 변환할 때에는 충분히 큰 타입으로 변환해야 손실이 없다. 비트 단위로 그대로 복사하는 캐스팅 방식이다. (동일한 비트 조합(?)을 자료형에 따라서 다르게 해석하기 때문에 reinterpret_cast 라는 이름을 붙인게 아닐까? 생각했다.) ### ✨ dynamic_cast 클래스의 레퍼런스나 포인터 타입을 캐스팅하는데 사용한다. 이 때 베이스 클래스는 가상함수가 적어도 하나 있는 polymorphic class여야만 한다. 자식포인터로 부모포인터를 가리키려고 할 때, 그 캐스팅이 가능한 캐스팅인지를 런타임 시에 확인한다. 중요한 것은 자식의 생성자로 생성이 되었고, 이미 부모 포인터로 업캐스팅 된 경우에 한하여 다시 자식 포인터로 다운캐스팅 하려고 할 때 이 캐스팅을 사용하는 것이다. 단순히 부모 생성자로 생성된 객체를 자식 포인터로 가리키려고 하면 되지 않는다. 포인터 타입으로 캐스팅을 할 경우에는 캐스팅이 실패할 경우 nullptr를 반환한다. 반면에 레퍼런스 타입으로 캐스팅 할 경우에는 실패한 경우 bad_cast exception을 던진다. ### ✨ const_cast 간단히 참고링크만 남김. - [\[C++\] const_cast (타입 캐스트 연산자)](https://blockdmask.tistory.com/240) - [c++ const_cast 가 필요한 이유](https://clucle.tistory.com/entry/c-constcast-%EA%B0%80-%ED%95%84%EC%9A%94%ED%95%9C-%EC%9D%B4%EC%9C%A0)