프로그래밍 공부
카테고리
작성일
2024. 1. 12. 16:00
작성자
WDmil
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