1항 연산자 - 변환 연산자 (Conversion Operator)
변환 연산자는 지정된 인스턴스를 다른 자료형 타입으로 변환하는 연산자입니다.
#include <iostream>
class FloatNumber
{
private:
float val;
public:
FloatNumber(float val)
{
this->val = val;
}
float getValue(){ return val; }
operator int()
{
return val + 1;
}
operator float()
{
return val + 2.0;
}
operator double()
{
return val + 3.0;
}
};
class Number
{
private:
int val;
public:
Number(int val)
{
this->val = val;
}
int getValue(){ return val; }
operator FloatNumber()
{
return FloatNumber((float)val);
}
};
int main(int argc, char** argv)
{
Number num(20);
// operator FloatNumber()가 있어서 변환 가능하다.
FloatNumber floatNum = num;
// 변환 불가능하다.
// num = floatNum;
printf("%d\n", (int)floatNum);
printf("%f\n", (float)floatNum);
printf("%f\n", (double)floatNum);
return 0;
}
21
22.00
23.00
변환 연산자는 반환형을 명시하지 않으며, operator '변환 자료형' () 으로 선언합니다.
- 변환 자료형에 맞는 인스턴스를 반환해야 하며, 묵시적 혹은 명시적으로 호출될 수 있습니다.
FloatNumber()의 구현에 의해, Number 는 FloatNumber 로 묵시적 변환이 가능합니다.
- FloatNumber 는 int, float, double 에 대한 operator 를 가지고 있습니다.
예제 내 출력문에서 명시적 캐스팅을 사용합니다. 클래스의 인스턴스의 경우 기본 반환이 자신의 인스턴스에 대한 레퍼런스이기 때문입니다. 또한 int, float, double 자료형은 묵시적 변환이 가능하므로, 이를 구별하기 위해 사용합니다.
- 이미 존재한 num 변수에 대입하는, num = floatNum; 은 불가능 합니다.
- 새로 생성하는 Number num2 = floatNum; 은 가능합니다.
- floatNum 이 int 로 묵시적 캐스팅되고, Number 의 생성자(변환생성자)가 int 값을 인수로 받아 호출됩니다.