C++의 operator 키워드는 특정 연산자 기호가 클래스의 인스턴스에 적용될 때 어떤 의미를 갖는지 정의하는 함수를 선언합니다. 이를 통해 하나의 연산자가 여러 가지 의미를 가질 수 있게 되며, 이것을 바로 "오버로드(overload)"라고 합니다. 컴파일러는 피연산자의 타입을 검사하여 해당 연산자가 지닌 서로 다른 의미를 구분합니다.
단항 연산자(Unary Operator)란?
단항 연산자는 하나의 피연산자에만 작용하는 연산자를 말하며, 대표적인 예는 다음과 같습니다.
- 증가(++) 및 감소(--) 연산자
- 단항 빼기(-) 연산자
- 논리 NOT(!) 연산자
단항 연산자는 호출된 객체 자신에 대해 동작하며, 일반적으로 !obj, -obj, ++obj처럼 객체의 왼쪽에 위치합니다(전위 표기법). 다만 obj++나 obj--처럼 후위 표기법으로도 사용할 수 있습니다.
단항 빼기 연산자 오버로드 예제
다음 예제는 전위 방식으로 사용되는 단항 빼기(-) 연산자를 오버로드하는 방법을 보여줍니다.
#include <iostream>
using namespace std;
class Distance {
private:
int feet;
int inches;
public:
// 생성자
Distance(int f, int i) {
feet = f;
inches = i;
}
// 거리를 화면에 출력하는 메서드
void display() {
cout << "F: " << feet << " I:" << inches << endl;
}
// 오버로드된 단항 빼기(-) 연산자
Distance operator-() {
feet = -feet;
inches = -inches;
return Distance(feet, inches);
}
};
int main() {
Distance D1(3, 4), D2(-1, 10);
-D1; // D1.operator-() 호출 → 부호 반전
D1.display();
-D2; // D2.operator-() 호출 → 부호 반전
D2.display();
return 0;
}
실행 결과
이 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
F: -3 I:-4 F: 1 I:-10
동작 원리 살펴보기
-D1; 문장이 실행되면 컴파일러는 Distance 클래스 내부에 정의된 operator-() 멤버 함수를 자동으로 호출합니다. 이 함수는 feet와 inches 멤버 변수의 부호를 반전시킨 뒤, 변경된 값으로 새로운 Distance 객체를 생성하여 반환합니다.
주목할 점은 위 예제의 operator-()가 반환값을 만들면서 동시에 호출된 객체 자신의 멤버 변수 값도 변경한다는 것입니다. 따라서 -D1; 실행 후에는 D1 자체의 값도 (-3, -4)로 바뀌어 display() 결과에 그대로 반영됩니다. 만약 원본 객체를 유지하고 싶다면 멤버 변수를 수정하지 않고 새 객체만 반환하도록 구현하는 것이 일반적입니다.