티스토리 뷰

반응형
🔷 C++ 단항 연산자 오버로딩: 객체 하나에 작동하는 연산 정의하기

🔷 C++ 단항 연산자 오버로딩: 객체 하나에 작동하는 연산 정의하기



✅ 1. 단항 연산자란 무엇인가요?

단항(unary) 연산자피연산자 하나에만 작동하는 연산자입니다.

-a      // 단항 부호 반전
!a      // 논리 부정
~a      // 비트 반전

C++에서는 기본 자료형(int, double 등)에 대해서는 이런 연산자들이 자동으로 정의되어 있지만,
우리가 직접 만든 클래스 객체에는 이 연산자들이 기본적으로 적용되지 않습니다.



🎯 2. 왜 단항 연산자 오버로딩이 필요한가요?

아래와 같은 Point 클래스를 생각해봅시다.

class Point {
public:
    int x, y;
};

다음과 같이 쓰고 싶습니다:

Point p(3, 4);
Point q = -p;  // x, y의 부호를 반전

하지만 이 코드는 컴파일 에러가 납니다.
Point 클래스는 - 연산자를 정의하지 않았기 때문입니다.



 

🧠 여기서 주의할 점: -pp1 - p2는 전혀 다르다!

표현 연산자 종류 의미 필요한 오버로딩
-p 단항 연산자 하나의 객체만 사용 Point operator-() const;
p1 - p2 이항 연산자 두 객체 간 연산 Point operator-(const Point&);

즉, 동일한 기호(-)라도 단항/이항은 완전히 다른 함수로 오버로딩해야 하며,
호출 방식도 다릅니다.



🔧 3. 단항 연산자 오버로딩 문법

단항 연산자는 매개변수가 없는 멤버 함수로 정의합니다.

리턴형 operator연산자() const;

예:

Point operator-() const;   // 부호 반전
bool operator!() const;    // 논리 부정


🛠️ 4. 예제 1: - 연산자 (부호 반전)

#include <iostream>
using namespace std;

class Point {
public:
    int x, y;

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

    Point operator-() const {
        return Point(-x, -y);
    }

    void print() const {
        cout << "(" << x << ", " << y << ")";
    }
};

int main() {
    Point p(3, 4);
    Point q = -p;

    cout << "원래 좌표: "; p.print(); cout << endl;
    cout << "부호 반전: "; q.print(); cout << endl;
    return 0;
}

✅ 실행 결과

원래 좌표: (3, 4)
부호 반전: (-3, -4)


 

🛠️ 5. 예제 2: ! 연산자 (논리적 참/거짓 여부)

#include <iostream>
using namespace std;

class Point {
public:
    int x, y;

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

    bool operator!() const {
        return (x == 0 && y == 0);
    }
};

int main() {
    Point p1(0, 0);
    Point p2(1, 2);

    cout << "!p1: " << (!p1 ? "참(true)" : "거짓(false)") << endl;
    cout << "!p2: " << (!p2 ? "참(true)" : "거짓(false)") << endl;
    return 0;
}

✅ 실행 결과

!p1: 참(true)
!p2: 거짓(false)

👉 논리 부정을 통해 "원점인지 아닌지"를 검사하는 용도로 오버로딩한 예시입니다.



🛠️ 6. 예제 3: ~ 연산자 (비트 반전)

비트 연산자는 잘 쓰이진 않지만, 특정 플래그성 클래스를 만들 때 유용할 수 있습니다.

class Flag {
public:
    unsigned char bits;

    Flag(unsigned char b) : bits(b) {}

    Flag operator~() const {
        return Flag(~bits);
    }
};

이처럼 C++에서는 비트 조작 기능도 오버로딩으로 지원 가능합니다.



📌 7. 오버로딩 시 주의할 점

항목 설명
매개변수 없음 단항 연산자는 피연산자 1개만
const 사용 멤버를 수정하지 않으면 붙이는 게 좋음
반환형 상황에 따라 객체 값 또는 논리값 (bool)
-는 이항 연산자와 혼동하지 않도록 명확히 분리할 것


🧭 정리

  • 단항 연산자는 객체 하나에만 작동하며, 우리가 만든 클래스에서는 직접 정의해야 사용 가능
  • 오버로딩은 멤버 함수로 정의하고, 매개변수는 없음
  • -, !, ~ 등 다양한 연산자에 대해 오버로딩 가능하며, 각각의 의미를 논리적으로 잘 설계해야 함
  • -pp1 - p2는 함수 구조부터 완전히 다르므로 혼동 금물
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함
반응형