Minwoo Dev.
[C++] C++ 형 변환 연산자 본문
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
'C++' 카테고리의 다른 글
[C++] 예외처리 try, catch, throw (0) | 2024.07.24 |
---|---|
[C++] 템플릿의 부분 특수화 (0) | 2024.07.24 |
[C++] 템플릿(Template), 템플릿 특수화(Specialization) (1) | 2024.07.24 |
[C++] 윤성우의 열혈 C++ 13-2 클래스 템플릿의 정의 문제풀이 (2) | 2024.07.23 |
[C++] 윤성우의 열혈 C++ 13-1 함수 템플릿의 정의 문제풀이 (0) | 2024.07.23 |