C++ 단항 연산자 오버로딩이란?
단항 연산자(unary operator)는 하나의 피연산자만을 대상으로 작동하는 연산자입니다. C++ 컴파일러는 피연산자의 자료형을 검사함으로써 같은 연산자 기호라도 상황에 따라 다른 의미로 해석합니다.
C++에서 대표적으로 사용되는 단항 연산자는 다음과 같습니다.
- 증가(++) 및 감소(--) 연산자
- 단항 마이너스(-) 연산자
- 논리 NOT(!) 연산자
단항 연산자는 호출된 객체 자신에 대해 작동하며, 일반적으로 !obj, -obj, ++obj처럼 객체의 왼쪽(전위, prefix)에 위치합니다. 다만 필요에 따라 obj++나 obj--처럼 후위(postfix) 형태로도 사용할 수 있습니다.
다음 예제는 느낌표(!) 연산자를 전위 방식으로 오버로드하는 방법을 보여줍니다.
예제 코드
#include <iostream>
using namespace std;
class Distance {
private:
int feet; // 0부터 무한대까지
int inches; // 0부터 12까지
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.display(); // D1 출력
!D2; // 부정(negation) 적용
D2.display(); // D2 출력
return 0;
}
코드 설명
위 예제에서 operator!() 함수는 Distance 클래스의 멤버 함수로 정의되었습니다. 이 연산자가 호출되면 객체의 feet와 inches 값에 음수 부호를 적용한 뒤, 변경된 값으로 새로운 Distance 객체를 생성하여 반환합니다. main() 함수에서 !D1을 호출하면 D1의 모든 멤버 변수 값이 부호 반전되어 저장됩니다.
실행 결과
위 코드를 컴파일하고 실행하면 다음과 같은 결과가 출력됩니다.
F: -3 I:-4 F: 1 I:-10
출력 결과를 보면 처음 값이 (3, 4)였던 D1은 (-3, -4)로, (-1, 10)이었던 D2는 (1, -10)으로 각각 부호가 반전된 것을 확인할 수 있습니다. 이처럼 연산자 오버로딩을 활용하면 사용자 정의 클래스 객체에도 기본 타입처럼 직관적인 연산을 적용할 수 있습니다.