Skip to content

[C++] 캐스트 연산자 (static_cast, dynamic_cast, const_cast, reinterpret_cast) #43

Open

Description

@ggjae

C의 타입 캐스팅 (묵시적, 암시적 형 변환)

ex)

int i = 3;
double d = 3.5;
i = double(d);

데이터의 손실이 일어날 수 있기 때문에 문제가 될 수 있다.

일반적으로 아래의 캐스트방법들은 함수<변환할타입>(변환대상)으로 진행된다.

static_cast

컴파일시에 논리적으로 변경 가능한 경우에 변경을 허용한다.
static_cast<변환할타입>(변환대상)으로 강제 캐스팅이 아닌 캐스트 연산자를 이용하여 캐스팅이 가능하다. 업캐스트, 다운캐스트 다 가능

ex) static_cast(3);

static_cast는 논리상 맞지 않는 변환을 막아주는 역할을 합니다.

문제점 : 상속관계에서의 형변환이 안전하지 못하다. (자식을 부모가 대체가능함)

dynamic_cast

dynamic_cast와 static_cast는 아예 다르다. 런타임 중 안정성 검사를 진행하고 상속관계에서의 업캐스트나 변환을 진행시켜주지만, 다른 데이터형 변환은 허용하지 않는다. 가상함수를 이용하면 다운캐스팅도 진행이 가능하다.

const_cast

어떤 값을 const나 volatile로, 또는 그 반대로 변경하는것이 유일한 목적

const로 선언했지만 값을 바꾸어주는 경우 const_cast를 사용한다.

reinterpret_cast

저수준 프로그래밍에서 위험한 데이터형 변환을 안전하게 진행시키기 위하여 사용한다.

Activity

  1. ggjae commented on Oct 10, 2021

    @ggjae
    OwnerAuthor

    그래서, 강제 캐스팅을 사용하는것보다 static_cast, dynamic_cast와 같은 캐스트 메소드를 사용했을 때의 이점이 뭔데?

    1. 컴파일러가 오류 체크

    강제 캐스팅을 사용하면 런타임시에 segmentation fault, runtime error 등 예기치 못한 에러의 발생을 야기할 수 있는데 컴파일러딴에서 오류를 잡아버리면 추후 문제가 될 가능성을 줄여주는 이점

    1. 상속관계에 있어도 형변환 가능

    다운캐스트에서는 안전하지 못한 것은 기억해야해. Liskov Substitution Principle도 기억하면 좋겠다. :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    documentationImprovements or additions to documentation

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions