728x90
C++에서는 4가지 형변환 연산자를 지원한다.
static_cast
정적캐스트로, 보통 정적 이라 하면 언어에서 컴파일시에~ 동적이라면 런타임시에~ 를 의미함으로,
static_cast연산자를 통해 형변환 하면 컴파일 타임에 형변환이 가능한지 검사한다.
컴파일 타임에 수행되는 가장 일반적인 형변환 연산자로, 안전한 형변환이 보장되는 상황에서 사용한다.
기본적인 형변환에서 사용되며, 명시적인 변환을 나타내는 특징이 있다.
장점
- 명시적이고 간단한 형변환 방법이다.
- 컴파일러에서 경고를 제공할 수 있다.
단점
- 런타임 유효성 검사가 없어서, 일부오류가 터졌을때 찾느라 머리도 같이 터질 수 있다.
float floatNumber = 3.14f;
int intNumber = static_cast<int>(floatNumber);
reinterpret_cast
포인터간, 혹은 포인터와 정수간의 강제 형변환을 수행한다.
일반적으로 허용하지 않는 형변환을 강제적으로 형변환할 때 사용한다.
포인터/참조와 관련된 형변환만 지원한다.
연관없는 두 포인터 형 사이의 변환을 허용한다.
장점
- 저수준에서 데이터전달을 유용하게 할 수 있다.
단점
- 안전성이 낮아질 수 있다.
- 가독성이 떨어진다.
int* intPointer = reinterpret_cast<int*>(0x1000);
const_cast
const속성을 추가하거나 제거하는데 사용된다.
주로 함수에서 상수성을 무시하고자 할 때나, 상수성을 유지하면서 함수에 전달하고자 할때 사용한다.
많이 사용하는 방식은 아니다.
장점
- const-correctness를 유지하면서 함수 간에 데이터를 유연하게 전달할 수 있다.
단점
- 실제로 const를 넣는다면, 넣는 이유가 있기 때문에, 알 수 없는오류가 터질 가능성이 있다.
- 하지말라는건 하지말라는 이유가 있다는걸 명심하자.
const int constantValue = 42;
int* nonConstPointer = const_cast<int*>(&constantValue);
dynmaic_cast
주로 상속관계에서 사용되며, 런타임에 안전한 다운캐스팅을 수행한다.
다운캐스팅이 가능한 경우에만 성공하며, 클래스가 가상 함수를 가져야 한다.
장점
- 안전한 다운캐스팅을 제공하여 런타임 오류를 방지한다.
- 다운캐스팅이 가능한 경우에만 성공시켜준다. 억지로 시키지 않음.
단점
- 라인을 따라가면서 다운캐스팅을 함으로, 실행비용이 높은편이다.
다운캐스팅이 불가능한경우, nullptr을 반환, std::bad_cast 예외를 발생하는 특징이 있다.
class Base { virtual void foo() {} };
class Derived : public Base {};
Base* basePtr = new Derived;
Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);
728x90
'C++ > 기초' 카테고리의 다른 글
가상 함수 테이블(virtual Function Table, Vtable) (0) | 2024.01.12 |
---|---|
Run-Time Type Information(RTTI) (0) | 2024.01.12 |
참조형 변수 (Reference Types) (0) | 2024.01.09 |
참조에 의한 전달 (Passing by Reference) (0) | 2024.01.09 |
값에 의한 전달(Passing by Value) (0) | 2024.01.09 |