Minwoo Dev.

[C++] C++ 형 변환 연산자 본문

C++

[C++] C++ 형 변환 연산자

itisminu 2024. 7. 24. 16:25
728x90
반응형
SMALL

C++에서 다형성을 이용하여 업캐스팅, 다운캐스팅을 할 때에 우리는 여러가지 형 변환을 사용한다.

형 변환 연산자를 사용하지 않아도 형 변환 명시를 통해 형변환이 가능하지만, 의도한 바를 명확히 표시하기 위해 "형 변환 연산자"를 사용한다.

 

 

형 변환 연산자

  • 의도치 않은 형변환에 의한 데이터 손실을 줄이기 위함
  • 컴파일러가 인식하여 이상하면 에러 발생시킬 수 있음

 

형 변환 연산자의 종류는 총 4가지이다.

  • static_cast
  • const_cast
  • dynamic_cast
  • reinterpret_cast

형 변환 연산자의 사용 방법은 아래와 같다.

형 변환 연산자<바꿀 타입>(바꿀 변수)

 


static_cast

  • 부모 클래스의 내용을 자식 클래스에 담는 경우(임의로)
  • 자식 클래스의 내용을 부모 클래스에 담는 경우(임의로)
  • 형 변환을 의도적으로 진행한다는 것을 명시함

에시 코드

#include<iostream>
using namespace std;

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

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

int main(void){
    Car *pcar1 = new Truck(80, 200);
    Truck *ptruck1 = static_cast<Truck *>(pcar1);
    ptruck1->ShowTruckState();
    cout << endl;

    Car *pcar2 = new Car(120);
    Truck *ptruck2 = static_cast<Truck *>(pcar2);
    ptruck2->ShowTruckState();
    return 0;
}

 

 

실행 결과

 

 

Truck 객체의 내용을 임의로 Car 클래스로 가리킨 것이다.

데이터의 손실이 발생하여 두번째 화물의 무게가 0으로 출력된다.

하지만 static_cast를 사용하여 이러한 점까지 임의로 캐스팅했다는 것을 명시하는 것이다.

 

 


const_cast

  • const 성향을 제거한다
  • const char*을 char* 로 바꿀 때 많이 사용한다.

예시 코드

#include<iostream>
using namespace std;

void ShowString(char* str){
    cout << str << endl;
}

void ShowAddResult(int& n1, int& n2){
    cout << n1 + n2 << endl;
}

int main(void){
    const char *name = "Lee Min Woo";
    ShowString(const_cast<char *>(name));

    const int &num1 = 100;
    const int &num2 = 200;
    ShowAddResult(const_cast<int &>(num1), const_cast<int &>(num2));
    return 0;
}

 

 

실행 결과

 

위 코드에서는 const char*을 char*으로 바꾸고, const int&를 int&로 바꾸는 데 const_cast를 사용하였다.

 

 

 

dynamic_cast

  • 상속 관계에 있는 자식 클래스의 내용을 부모 클래스로 바꿀 때 사용한다.
#include<iostream>
using namespace std;

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

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

int main(void){
    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);
    return 0;
}

 

 

위 코드에서는 마지막의 ptruck3만 정상적으로 실행이 된다.

왜냐하면 dynamic_cast는 상속 관계에 있는 자식 클래스를 부모 클래스로 바꿀때만 사용하기 때문이다.

 

 

 


reinterptre_cast

  • 전혀 상관이 없는 자료형의 형변환
  • 상속 관계가 아닌, 정말 상관없는 클래스들 간의 형변환에 사용

 

예시 코드

#include<iostream>
using namespace std;

int main(void){
    int num = 0x010203;
    char *ptr = reinterpret_cast<char *>(&num);

    for (int i = 0; i < sizeof(num);i++)
        cout << static_cast<int>(*(ptr + i)) << endl;

    return 0;
}

 

 

실행 결과

728x90
반응형
LIST