티스토리 뷰
반응형
⚖️ 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. 비교 연산자 오버로딩은 어떻게 구현할 수 있나?
이제 여기서 비교 연산자를 구현하는 방법이 등장합니다.
이 타이밍에 설명이 들어가야 독자가 자연스럽게 받아들일 수 있습니다.
구현 방식은 두 가지가 있습니다:
🔧 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<
가 필요합니다.
반응형
'홍정모 따라 배우는 C++ > C++ 오버로딩' 카테고리의 다른 글
🔼 C++ 증감 연산자 오버로딩: 전위, 후위 증가 감소 (0) | 2025.06.13 |
---|---|
C++ 단항 연산자 오버로딩: 객체 하나에 작동하는 연산 정의하기 (0) | 2025.06.12 |
C++ 입출력 연산자 오버로딩: 객체도 cin, cout 으로 다룰 수 있을까? (0) | 2025.06.11 |
C++ 산술 연산자 오버로딩: 숫자처럼 객체를 더하려면? (0) | 2025.06.11 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 문제 풀이
- 그래프 탐색
- C++
- 객체지향
- 알고리즘
- 그리디
- dfs
- c++알고리즘
- DP
- c언어
- 파이썬
- 문제풀이
- 코딩테스트
- 코딩 테스트
- 동적계획법
- 알고리즘 문제풀이
- C++ 알고리즘
- 알고리즘기초
- 코딩
- 백준
- Python
- python 알고리즘
- 브루트포스
- 그리디알고리즘
- 알고리즘문제풀이
- 문자열처리
- 동적 계획법
- 인접 행렬
- 파이썬코딩
- 프로그래밍
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함
반응형