C++

[C++] 형 변환

hanseongbugi 2024. 12. 18. 16:00

C style type casting

  • C 스타일로 형 변환을 하게 된다면 코딩 과정에서 실수를 하여도 컴파일러가 잡아내지 못하는 문제가 있다.
  • C 스타일로 형 변환을 지시하면 컴파일러는 맞는 형 변환인지 판단하지 않는다.
    • 부모 객체를 자식 객체로 형 변환시 문제가 발생할 수 있음
  • 컴파일러는 프로그래머의 실수를 지적하고 싶지만, C 스타일 형 변환 연산은 잘못되었는지 지적할 수 없다.

C++ 변환 연산자

  • C++에서는 4 개의 연산자를 통해 용도에 맞는 형 변환 연산자의 사용을 유도한다.
    1. static_cast
    2. const_cast
    3. dynamic_cast
    4. reinterpret_cast

dynamic_cast : 상속관계에서의 안전한 형 변환

  • dynamic_cast 형 변환 연산자는 다음의 형태를 갖는다.
dynamic_cast<T>(expr)
  • <> 사이에 변환하고자 하는 자료형의 이름을 둔다.
    • 이때, 객체의 포인터 또는 참조형이 와야한다.
  • () 사이에는 변환의 대상이 와야한다.
#include <iostream>

class Car {
private:
    int fuelGauge;
public:
    Car(int fuel) : fuelGauge(fuel) {}
    void showCarState()
    {
        std::cout << "잔여 연료량: " << fuelGauge << std::endl;
    }
};

class Truck : public Car {
private:
    int freightWeight;
public:
    Truck(int fuel, int weight) : Car(fuel), freightWeight(weight) {}
    void showTruckState()
    {
        showCarState();
        std::cout << "화물의 무게: " << freightWeight << std::endl;
    }
};

int main()
{
    Car* pCar1 = new Truck(80, 200);
    Truck* pTruck1 = dynamic_cast<Truck*>(pCar1); // <--- 컴파일 에러

    Car* pCar2 = new Car(120);
    Truck* pTruck2 = dynamic_cast<Truck*>(pCar2); // <--- 컴파일 에러

    Truck* pTruck3 = new Truck(70, 150);
    Car* pCar3 = dynamic_cast<Car*>(pTruck3);
}
  • dynamic_cast를 사용하는 것은 다음의 의미를 가지고 있다.
    • 상속 관계에 있는 유도 클래스의 포인터 및 참조형 데이터를 기초 클래스의 포인터 및 참조형 데이터로 형 변환 하겠다.

static_cast : A타입에서 B타입으로

static_cast<T>(expr)
  • static_cast를 사용하면 dynamic_cast의 기능 뿐만 아니라 기초 클래스 데이터를 유도 클래스의 데이터로 형 변환 할 수 있다.
    • 물론 포인터 및 참조형 데이터를 변환한다.
#include <iostream>

class Car {
private:
    int fuelGauge;
public:
    Car(int fuel) : fuelGauge(fuel) {}
    void showCarState()
    {
        std::cout << "잔여 연료량: " << fuelGauge << std::endl;
    }
};

class Truck : public Car {
private:
    int freightWeight;
public:
    Truck(int fuel, int weight) : Car(fuel), freightWeight(weight) {}
    void showTruckState()
    {
        showCarState();
        std::cout << "화물의 무게: " << freightWeight << std::endl;
    }
};

int main()
{
    Car* pCar2 = new Car(120);
    Truck* pTruck2 = static_cast<Truck*>(pCar2);

    Truck* pTruck3 = new Truck(70, 150);
    Car* pCar3 = static_cast<Car*>(pTruck3);
}
  • static_cast는 기본 자료형 데이터간의 형 변환에서도 사용된다.
int main()
{
    int num1 = 20, num2 = 3;
    double result = static_cast<double>(20) / 3;
}
  • static_cast 연산자는 C언어의 형 변환 연산자보다 적은 것을 허용하고 있다.
    • 따라서 상속 관계의 형 변환인지, 기본 자료형 데이터의 형 변환인지만 판단하면 된다.

 

 

 

 

 

 

출처

윤성우 열혈 C++ 프로그래밍