티스토리 뷰

반응형
⚖️ C++ 비교 연산자 오버로딩: 객체를 ==, < 등으로 비교하려면?

⚖️ C++ 비교 연산자 오버로딩: 객체를 ==, < 등으로 비교하려면?



✅ 1. 기본 자료형은 비교가 된다

int a = 3, b = 5;
if (a < b) cout << "a가 더 작다";

이처럼 int, double 같은 기본 자료형은
==, <, !=, > 등의 비교 연산자를 기본적으로 사용할 수 있습니다.



❌ 2. 사용자 정의 자료형은 비교가 안 된다

이제 Point라는 클래스를 만들었다고 해봅시다.

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

Point p1(1, 2), p2(1, 2);

if (p1 == p2) { /* 같은지 판단 */ }  // ❌ 오류 발생

error: no match for ‘operator==’

즉, 클래스는 자동으로 비교할 수 없습니다.
C++은 Point라는 객체가 “같다”는 것이 무엇을 기준으로 정의되는지 알 수 없습니다.



🎯 3. 어떻게 해결할까? 👉 연산자 오버로딩

비교 연산자를 객체에 대해 직접 정의해주자.
즉, ==, <, != 등을 오버로딩해서 객체가 비교 가능하도록 만들자.

이걸 비교 연산자 오버로딩이라고 합니다.



📐 4. 비교 연산자 오버로딩은 어떻게 구현할 수 있나?

이제 여기서 비교 연산자를 구현하는 방법이 등장합니다.
이 타이밍에 설명이 들어가야 독자가 자연스럽게 받아들일 수 있습니다.

구현 방식은 두 가지가 있습니다:

구현 방식 예시 코드 특징
멤버 함수 방식 bool operator==(const Point&) const 클래스 내부에서 정의함
외부 함수 + friend friend bool operator==(const Point&, const Point&) 클래스 외부에서 정의하고 접근권 부여


🔧 5. [예제 A] 멤버 함수 방식으로 ==, < 오버로딩

#include <iostream>
using namespace std;

class Point {
public:
    int x, y;

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

    bool operator==(const Point& other) const {
        return x == other.x && y == other.y;
    }

    bool operator<(const Point& other) const {
        if (y != other.y) return y < other.y;
        return x < other.x;
    }
};

int main() {
    Point p1(3, 4), p2(3, 4), p3(2, 5);

    cout << "p1 == p2 ? " << (p1 == p2 ? "true" : "false") << endl;
    cout << "p1 == p3 ? " << (p1 == p3 ? "true" : "false") << endl;
    cout << "p1 < p3 ? "  << (p1 < p3  ? "true" : "false") << endl;

    return 0;
}

✅ 실행 결과

p1 == p2 ? true  
p1 == p3 ? false  
p1 < p3  ? true


🔧 6. [예제 B] friend 함수 방식으로 ==, < 오버로딩

#include <iostream>
using namespace std;

class Point {
public:
    int x, y;

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

    friend bool operator==(const Point& a, const Point& b);
    friend bool operator<(const Point& a, const Point& b);
};

bool operator==(const Point& a, const Point& b) {
    return a.x == b.x && a.y == b.y;
}

bool operator<(const Point& a, const Point& b) {
    if (a.y != b.y) return a.y < b.y;
    return a.x < b.x;
}


🧪 7. STL sort는 왜 비교 연산자가 필요할까?

std::sort두 객체를 정렬할 때 내부적으로 < 연산자를 사용합니다.
그래서 operator<를 오버로딩하지 않으면 에러가 발생합니다.

#include <vector>
#include <algorithm>

int main() {
    vector<Point> v = { {3, 4}, {2, 1}, {1, 4} };

    sort(v.begin(), v.end());  // ✅ 내부에서 v[i] < v[j] 를 호출함

    for (auto& p : v)
        cout << "(" << p.x << ", " << p.y << ") ";
}

✅ 실행 결과

(2, 1) (1, 4) (3, 4)

👉 sort()를 사용하려면 반드시 operator<가 정의되어 있어야 합니다!



🧭 정리

  • C++은 사용자 정의 객체끼리 비교하려면 연산자를 직접 오버로딩해야 합니다.
  • ==, <, !=, >= 등은 모두 오버로딩 가능하며, bool을 반환해야 합니다.
  • 구현 방법은 멤버 함수 또는 friend 함수 두 가지가 있으며, 목적에 맞게 선택하면 됩니다.
  • STL의 sort, set, map 등을 사용하려면 반드시 operator<가 필요합니다.
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함
반응형