우리가 일반적으로 흔히 사용하는 (int)a 와 같은 형 변환은 C style이다.
C++에도 c++만의 형 변환이 있다. 왜 두가지의 형변환이 필요하지? 라고 궁금할 수도 있는데. c스타일의 형변환은
읽기가 어려울 수 도 있다. ( ) 는 함수에서도 쓰이고, 아주 많은 곳에서 쓰이는 것이기 때문에 자칫하면 놓칠수도 있다.
그래서 C++ 스타일의 형변환은 읽기에도 편하고, 어떤 용도로 사용 했는지도 알기 쉽다. C++ 에는 총 4가지의 형변환이
있다. 차근차근 알아보자.
1. 일반적인 형변환.
일반적으로 많이 쓰는 int - > float 와 같은 형변환이다.
static_cast<type>(대상)
으로 사용한다. 예를 보자.
float a = 10.2;
int b = static_cast<int>(a);
와 같이 사용한다. 일반적으로 C 에서 () 쓰는 것과 같다.
2. 위험한 형변환.
일반적으로는 안되는 형변환이다. 포인터를 int 형으로 변환하는 것과 같은 경우다.
reinterpret_cast<type>(대상)
과 같이 쓰고 사용법은 일반적인 형변환과 같다.
3. const 를 없애는 형 변환
const_cast<type>(대상) 과 같이 사용하고, 사용법은 같다.
4. 상속 관계에 있는 class 간의 형변환
dynamic_cast<type>(대상) 으로 사용한다. 사용법은 같다.
이 형변환의 경우 컴퓨터가 알아서 위험한 것인지 아닌지를 검사까지 해준다. 이 형변환은 부모클래스->자식
으로 형변환 할때 유용하다. 이 형 변환은 C로는 흉내 낼 수 없다.
과 같이 4가지의 경우를 살펴봤다. C보다는 확실히 무슨 용도로 쓰이는지 알기 쉽고, 또 안전하다고 할 수 있다.
추가로 생성한 클래스를 형변환 하는 방법에 대해 쓰겠다.
class Complex {
public :
int Real;
int Imag;
Complex(int a, int b) : Real(a), Imag(b) {}
}
와 같은 클래스가 있다고 하자. 이 클래스를 int 형으로 형 변환 하고 싶다면,
클래스 내부에
operator int() { return this->Real; } 과 같이 해주면 int 형으로 형 변환 하면 실수부를 반환하라는 의미로 사용 할 수 있다.
저렇게 하면 ,
int i = A //Complex class 객체
와 같이 사용 할 수 있다.
또 정수를 complex 형으로 바꾸고 싶다면 complex 클래스에 정수하나는 인자로같은 생성자를 만들어 주면 된다.
Complex(int a ) : Real(a), Imag(0) {}
과 같이 하면, 허수부는 0 인 complex 객체가 만들어지는데 이를 활용하면 된다.
그럼 A = i ; 와 같이 사용 할 수 있다. 이는 A = Complex(i) 와 같은 의미가 된다.
이와 관련해서 explicit 이라는 키워드가 있는데 , 이는 암시적인 형 변환을 못하게 하고, 명시적인 형변환만 가능하게 한다. 암시적인 것은 예상 못하게 될 수도 있으니 그걸 미리 방지 할 수 있다.
위 와 같은 경우에는 생성자에
explicit Complex(int a) ~~ 와 같이 해주면 명시적인 형 변환만 가능하게 된다.
'!? > C++' 카테고리의 다른 글
QT File browser (0) | 2014.08.29 |
---|---|
QT Excel Automation (0) | 2014.08.25 |
연산자 오버로딩 (0) | 2012.10.12 |
접근 범위, 존속 기간 (0) | 2012.09.14 |
Exception Handling (0) | 2012.09.10 |