이 글에서는 C++의 변환 연산자(Conversion Operator)가 무엇인지, 그리고 어떻게 활용하는지 살펴보겠습니다.
C++은 객체 지향 프로그래밍을 지원하기 때문에 현실 세계의 사물을 하나의 구체 타입(concrete type)으로 만들어 클래스로 표현할 수 있습니다. 그런데 프로그래밍을 하다 보면 특정 클래스의 객체를 다른 타입의 객체나 int, double 같은 기본 자료형(primitive data type)으로 변환해야 하는 경우가 종종 발생합니다.
이럴 때 사용하는 것이 바로 변환 연산자입니다. 변환 연산자는 클래스 내부에 연산자 오버로딩(operator overloading) 함수와 유사한 형태로 정의하며, 컴파일러가 암시적 타입 변환을 수행할 수 있도록 도와줍니다.
변환 연산자의 기본 문법
operator 대상타입() {
// 변환된 값을 반환
}변환 연산자는 반환 타입을 명시하지 않으며, 연산자 이름 자체가 곧 반환 타입이 됩니다. 또한 매개변수를 가질 수 없고, const 멤버 함수로 선언하는 것이 일반적입니다.
예제 코드
다음 예제에서는 복소수(complex number)를 표현하는 클래스를 만들어 보겠습니다. 이 클래스는 실수부(real)와 허수부(imaginary) 두 멤버 변수를 가지며, 객체를 double 타입에 대입하면 변환 연산자를 통해 복소수의 크기(magnitude) 값으로 자동 변환됩니다.
#include <iostream>
#include <cmath>
using namespace std;
class My_Complex {
private:
double real, imag;
public:
// 기본 생성자
My_Complex(double re = 0.0, double img = 0.0) : real(re), imag(img) {}
// 일반 함수로 크기(magnitude) 구하기
double mag() {
return getMagnitude();
}
// double 타입으로 변환하는 변환 연산자
operator double() {
return getMagnitude();
}
private:
// 복소수의 크기 계산
double getMagnitude() {
return sqrt(real * real + imag * imag);
}
};
int main() {
My_Complex complex(10.0, 6.0);
cout << "일반 함수를 사용한 크기: " << complex.mag() << endl;
cout << "변환 연산자를 사용한 크기: " << complex << endl;
}실행 결과
일반 함수를 사용한 크기: 11.6619 변환 연산자를 사용한 크기: 11.6619
코드 설명
위 예제에서 복소수 (10 + 6i)의 크기는 √(10² + 6²) = √136 ≈ 11.6619 입니다.
complex.mag()처럼 일반 멤버 함수를 호출하면 명시적으로 크기를 얻을 수 있고, cout << complex처럼 객체를 그대로 출력 스트림에 넘기면 컴파일러가 operator double()을 자동으로 호출하여 객체를 double 값으로 변환한 뒤 출력합니다.
주의할 점
변환 연산자는 편리하지만 남용하면 의도하지 않은 암시적 변환이 발생하여 버그의 원인이 될 수 있습니다. 따라서 C++11 이후에는 explicit 키워드를 붙여 명시적 변환 시에만 동작하도록 제한하는 방식이 권장됩니다.