티스토리 뷰

반응형
🔼 C++ 증감 연산자 오버로딩

🔼 C++ 증감 연산자 오버로딩



✅ 1. 증감 연산자란?

C++에서 자주 쓰이는 ++, -- 연산자는 다음 두 가지 방식으로 사용됩니다.

전위(prefix)

++a;   // 먼저 증가시킨 후, 그 결과값을 사용

후위(postfix)

a++;   // 원래 값을 사용한 후, 나중에 증가시킴

예를 들어:

int a = 3;
int b = ++a;  // b = 4, a = 4
int c = a++;  // c = 4, a = 5


❓ 왜 전위/후위를 나눠야 하나요?

사용자 정의 클래스에서도 ++를 쓰고 싶을 때,
컴파일러는 ++의 위치에 따라 다른 동작을 기대합니다.

하지만 컴파일러 입장에서 둘 다 operator++()로 보이기 때문에
전위/후위를 명확히 구분해서 정의하지 않으면 오류나 예기치 않은 동작이 발생합니다.



🎯 해결: 함수 시그니처로 구분한다

구분 함수 시그니처 반환형
전위 증가 Point& operator++() 참조 (자기자신)
후위 증가 Point operator++(int) 값 복사본
전위 감소 Point& operator--() 참조
후위 감소 Point operator--(int) 값 복사본

✔️ 후위 버전은 인자를 받는 척 int 하나를 넣습니다 (실제로는 아무 의미 없음).
int는 오직 전위와 후위를 구분하기 위한 문법적 장치입니다.



 


💻 예제: 전위/후위 ++, -- 연산자 오버로딩

🧾 이 코드의 목적

  • Point 클래스에 대해 전위 및 후위 ++, --를 오버로딩
  • 각각 어떤 방식으로 동작하는지 명확하게 구분
  • 객체를 출력할 수 있도록 << 연산자도 함께 오버로딩
#include <iostream>
using namespace std;

class Point {
public:
    int x, y;

    Point(int x = 0, int y = 0) : x(x), y(y) {}

    // 전위 증가
    Point& operator++() {
        ++x;
        ++y;
        return *this;
    }

    // 후위 증가
    Point operator++(int) {
        Point temp = *this;  // 복사본 저장
        x++;
        y++;
        return temp;         // 복사본 반환
    }

    // 전위 감소
    Point& operator--() {
        --x;
        --y;
        return *this;
    }

    // 후위 감소
    Point operator--(int) {
        Point temp = *this;
        x--;
        y--;
        return temp;
    }

    // 출력 연산자 오버로딩
    friend ostream& operator<<(ostream& os, const Point& p) {
        os << "(" << p.x << ", " << p.y << ")";
        return os;
    }
};

int main() {
    Point p(1, 2);

    cout << "원래 p:       " << p << endl;
    cout << "++p (전위):   " << ++p << endl;
    cout << "p++ (후위):   " << p++ << endl;
    cout << "변경된 p:     " << p << endl;
    cout << "--p (전위):   " << --p << endl;
    cout << "p-- (후위):   " << p-- << endl;
    cout << "최종 p:       " << p << endl;
}


🧠 코드 해설

연산자 작동 방식 반환 변경 시점
++p x, y를 먼저 증가시킨 후 결과 반환 참조 먼저 증가
p++ 증가 전의 복사본 반환 후 원본 증가 나중에 증가
--p 먼저 감소시키고 결과 반환 참조 먼저 감소
p-- 복사본 반환 후 감소 나중에 감소


✅ 실행 결과

원래 p:       (1, 2)  
++p (전위):   (2, 3)  
p++ (후위):   (2, 3)  
변경된 p:     (3, 4)  
--p (전위):   (2, 3)  
p-- (후위):   (2, 3)  
최종 p:       (1, 2)


 


🚨 주의할 점 요약

구분 인자 반환형 핵심 목적
전위 없음 참조 현재 객체를 직접 반환
후위 int 복사본 (값) 변경 전 값을 임시 반환
구현 순서 전위 먼저 구현 → 후위는 전위 재사용, 효율적 구현 가능

※ 후위 연산자에서 Point temp = *this는 반드시 필요합니다.
변경되기 전의 값을 반환해야 하기 때문입니다.



✅ 마무리 요약

  • 증감 연산자 ++, --는 전위/후위로 나뉘며 의미와 구현이 다릅니다.
  • 전위: 바로 값을 바꾸고 그 결과를 반환 (Point& operator++())
  • 후위: 변경 전 값을 복사해서 반환하고 나중에 바꿈 (Point operator++(int))
  • 두 버전을 명확히 구분해야 STL 및 사용자 코드를 안정적으로 작성할 수 있습니다.
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/10   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함
반응형