C++에서 증가(++) 연산자와 감소(--) 연산자는 가장 중요한 단항(unary) 연산자 두 가지입니다. 이 연산자들을 클래스에 대해 오버로딩하면 사용자 정의 타입에서도 기본 타입처럼 자연스럽게 값을 증감시킬 수 있습니다.
다음 예제는 전위(prefix) 방식과 후위(postfix) 방식 모두에 대해 증가(++) 연산자를 오버로딩하는 방법을 보여줍니다. 동일한 방식으로 감소(--) 연산자도 오버로딩할 수 있습니다.
핵심 개념: 전위와 후위를 구분하는 방법
컴파일러는 함수 매개변수의 유무로 두 버전을 구분합니다. 매개변수가 없으면 전위(++obj) 연산자로 해석하고, 더미(dummy) int 매개변수를 받으면 후위(obj++) 연산자로 해석합니다. 후위 연산자는 증가하기 전의 값을 먼저 저장해 두었다가, 객체를 증가시킨 후 저장해 둔 이전 값을 반환한다는 점이 핵심입니다.
예제 코드
#include <iostream>
using namespace std;
class Time {
private:
int hours;
int minutes;
public:
Time(int h, int m) {
hours = h;
minutes = m;
}
void display() {
cout << "H: " << hours << " M:" << minutes << endl;
}
// 전위(prefix) ++ 연산자 오버로딩
Time operator++ () {
++minutes; // 현재 객체 증가
if(minutes >= 60) {
++hours;
minutes -= 60;
}
return Time(hours, minutes);
}
// 후위(postfix) ++ 연산자 오버로딩
Time operator++( int ) {
Time T(hours, minutes); // 증가 전 상태 저장
// 현재 객체 증가
++minutes;
if(minutes >= 60) {
++hours;
minutes -= 60;
}
// 증가하기 전의 원래 값 반환
return T;
}
};
int main() {
Time T1(11, 59), T2(10, 40);
++T1; // 전위 증가
T1.display();
++T1;
T1.display();
T2++; // 후위 증가
T2.display();
T2++;
T2.display();
return 0;
}
실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다 −
H: 12 M:0 H: 12 M:1 H: 10 M:41 H: 10 M:42
코드 설명
전위(++T1): 분(minutes)을 먼저 증가시키고, 60분 이상이 되면 시간(hours)을 1 올린 뒤 분에서 60을 뺍니다. T1은 11시 59분에서 시작하므로 첫 번째 호출 후 12시 0분, 두 번째 호출 후 12시 1분이 출력됩니다.
후위(T2++): 증가하기 전의 상태를 별도의 객체 T에 저장한 뒤 현재 객체를 증가시키고, 저장해 둔 이전 값을 반환합니다. 이 예제에서는 반환값을 사용하지 않고 곧바로 display()를 호출했기 때문에 증가된 값이 화면에 표시됩니다. T2는 10시 40분에서 시작하여 첫 호출 후 10시 41분, 두 번째 호출 후 10시 42분으로 출력됩니다.