C++ 연산자 오버로딩 정리 📌

내가 공부하다가 도저히 정리가 안되고 계속 오류만 떠서 공부하려고 정라하는 내용

C++에서 연산자 오버로딩을 활용하면 사용자 정의 구조체나 클래스를

STL 함수(sort, max_element 등)와 함께 쉽게 사용할 수 있다.


🔹 연산자 오버로딩(operator overloading)이란?

: C++에서 제공하는 연산자(+, <, == 등)를

사용자 정의 타입(구조체, 클래스)에서도 사용할 수 있도록 정의하는 기능

예제: 기본 구조체

struct Data { int x, y; };

위와 같은 구조체가 있을 때, std::sort()를 사용하여 정렬하려고 하면

비교 기준을 정의하지 않았으므로 오류가 발생하는데,

이를 해결하기 위해 < 연산자를 오버로딩할 수 있다.


🔹 비교 연산자 < 오버로딩

나는 1) x큰 순, 2) y큰 순(x 값이 같을 때)으로 우선순위를 둬서 < 연산자를 정의하려고 한다.

struct Data {
    int x, y;

    // 비교 연산자 오버로딩
    bool operator<(const Data &a) const {
        if (x != a.x) return x < a.x; // X 기준 정렬
        return y < a.y;               // X가 같다면 Y 기준 정렬
    }
};

📌 const 키워드는 객체를 수정하지 않겠다는 의미!!!!!

📌 operator< 연산자를 정의하면 sort() 같은 함수에서 자동으로 적용됨

사용 예시

#include <iostream>
#include <algorithm>
using namespace std;

int main() {
    Data arr[] = {{3, 4}, {5, 1}, {3, 1}, {2, 2}};
    int N = 4;

    sort(arr, arr + N); // 오름차순 정렬

    for (int i = 0; i < N; i++)
        printf("(%d,%d) ", arr[i].x, arr[i].y);
    printf("\n");

    return 0;
}  // 출력 결과 (2,2) (3,1) (3,4) (5,1)

 


 

🔹 STL 정렬을 위한 사용자 정의 비교 함수

특정한 기준으로 정렬해야 하는 경우,

STL의 sort()에서 **비교 함수(Comparator)**를 사용할 수도 있다.

나는 1) y값이 작은순 2) x값 큰순 (y 같을 때)를 기준으로 만들어보려고 한다

bool comp(const Data &a, const Data &b) {
    if (a.y != b.y) return a.y < b.y; // Y 기준 정렬
    return a.x > b.x;                 // Y가 같다면 X 기준 정렬
}

사용 예시

sort(arr, arr + N, comp); // 사용자 정의 비교 함수 사용
 

 

🔹 최댓값, 최솟값 찾기 (max_element, min_element)

연산자 < 를 오버로딩하면 max_element(), min_element() 등을 사용가능!

auto Max = *max_element(arr, arr + N);
printf("최댓값: (%d,%d)\n", Max.x, Max.y);

operator< 를 오버로딩했기 때문에 max_element()가 자동으로 비교 기준을 적용한다.


🔹 객체 출력 연산자 << 오버로딩

C++에서 cout을 사용하여 구조체를 출력하려면 operator<<를 오버로딩해야 한다.

#include <iostream>
using namespace std;

struct Data {
    int x, y;

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

int main() {
    Data d = {3, 4};
    cout << d << endl; // (3,4) 출력
}

✅ printf를 사용하면 cout 오버로딩 없이도 출력할 수 있다.

printf("(%d,%d)\n", d.x, d.y);


🔹 정리

연산자
사용 목적
예제
operator<
비교 연산 (정렬, max/min 찾기)
sort(arr, arr + N);
operator<<
출력 연산 (cout 지원)
cout << obj;
사용자 정의 비교 함수
특별한 정렬 기준 적용
sort(arr, arr + N, comp);

💡 TIP:

  • 연산자 오버로딩을 활용하면 STL 함수(sort, max_element 등)를 편리하게 사용할 수 있음.
  • operator<만 정의해도 sort(), max_element(), min_element() 등이 자동으로 적용됨.
  • 객체를 cout으로 출력하려면 operator<<를 오버로딩해야 함.
  • 빠른 실행이 필요하면 printf()로 직접 멤버 변수를 출력하는 것이 유리함.

얼렁뚱땅 연산자 오버로딩 정리 끝~!

나중에 또 쓸일 있으면 구글링 하는 대신 이거 보고 할 수 있길 바라며...

'C++' 카테고리의 다른 글

c++로 조합 구현하기  (0) 2025.06.19
데이터 파싱  (0) 2025.06.17
정렬용 비교 함수 객체  (0) 2025.06.17
포인터 (나중에 다시 또 공부하기;)  (1) 2025.06.17
배열  (0) 2025.06.17

+ Recent posts