C style type casting
- C 스타일로 형 변환을 하게 된다면 코딩 과정에서 실수를 하여도 컴파일러가 잡아내지 못하는 문제가 있다.
- C 스타일로 형 변환을 지시하면 컴파일러는 맞는 형 변환인지 판단하지 않는다.
- 부모 객체를 자식 객체로 형 변환시 문제가 발생할 수 있음
- 컴파일러는 프로그래머의 실수를 지적하고 싶지만, C 스타일 형 변환 연산은 잘못되었는지 지적할 수 없다.
C++ 변환 연산자
- C++에서는 4 개의 연산자를 통해 용도에 맞는 형 변환 연산자의 사용을 유도한다.
- static_cast
- const_cast
- dynamic_cast
- 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++ 프로그래밍
'C++' 카테고리의 다른 글
[C++] 스마트 포인터 (1) | 2024.12.18 |
---|---|
[C++] 예외처리 (0) | 2024.12.18 |
[C++] 가변 길이 템플릿 (1) | 2024.12.17 |
[C++] 템플릿 (1) | 2024.12.17 |
[C++] 가상 상속 (0) | 2024.12.17 |
C style type casting
- C 스타일로 형 변환을 하게 된다면 코딩 과정에서 실수를 하여도 컴파일러가 잡아내지 못하는 문제가 있다.
- C 스타일로 형 변환을 지시하면 컴파일러는 맞는 형 변환인지 판단하지 않는다.
- 부모 객체를 자식 객체로 형 변환시 문제가 발생할 수 있음
- 컴파일러는 프로그래머의 실수를 지적하고 싶지만, C 스타일 형 변환 연산은 잘못되었는지 지적할 수 없다.
C++ 변환 연산자
- C++에서는 4 개의 연산자를 통해 용도에 맞는 형 변환 연산자의 사용을 유도한다.
- static_cast
- const_cast
- dynamic_cast
- 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++ 프로그래밍
'C++' 카테고리의 다른 글
[C++] 스마트 포인터 (1) | 2024.12.18 |
---|---|
[C++] 예외처리 (0) | 2024.12.18 |
[C++] 가변 길이 템플릿 (1) | 2024.12.17 |
[C++] 템플릿 (1) | 2024.12.17 |
[C++] 가상 상속 (0) | 2024.12.17 |