ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄/C++ 기초

[C++] 19. μ—°μ‚°μž μ˜€λ²„λ‘œλ”©(Operator Overloading)

μ„œμ•„λž‘πŸ˜ 2023. 8. 7. 09:05

 

 

 

μ—°μ‚°μž μ˜€λ²„λ‘œλ”©(Operator Overloading)

μ—°μ‚°μž μ˜€λ²„λ‘œλ”©μ€ μ‚¬μš©μž μ •μ˜ 데이터 νƒ€μž…μ— λŒ€ν•΄ 기쑴의 μ—°μ‚°μžλ₯Ό μƒˆλ‘œ μ •μ˜ν•˜μ—¬ μ‚¬μš©ν•  수 있게 ν•˜λŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€. 즉 μ—°μ‚°μž(+, -, /, *, ++, --, =, ==, <, >, <=, >= λ“±)λ₯Ό λ‚΄λ§ˆμŒλŒ€λ‘œ μž¬μ •μ˜ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 이λ₯Ό 톡해 μ‚¬μš©μžκ°€ μ •μ˜ν•œ ν΄λž˜μŠ€λ‚˜ ꡬ쑰체에 λŒ€ν•΄ μ‚°μˆ  μ—°μ‚°, 비ꡐ μ—°μ‚° λ“±μ˜ μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ—°μ‚°μž μ˜€λ²„λ‘œλ”©μ€ C++의 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ 핡심적인 νŠΉμ§• 쀑 ν•˜λ‚˜λ‘œ, μ½”λ“œ 가독성을 높이고 직관적인 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•˜λŠ” 데에 μœ μš©ν•©λ‹ˆλ‹€.

μ—°μ‚°μž μ˜€λ²„λ‘œλ”©μ€ λ‹€μŒκ³Ό 같은 ν˜•μ‹μœΌλ‘œ κ΅¬ν˜„λ©λ‹ˆλ‹€.

return_type operator μ—°μ‚°μž(λ§€κ°œλ³€μˆ˜) {
    // μ—°μ‚°μžλ₯Ό μ •μ˜ν•˜λŠ” μ½”λ“œ
}



μ—¬κΈ°μ„œ `return_type`은 μ—°μ‚° κ²°κ³Όμ˜ λ°˜ν™˜ νƒ€μž…이며, `μ—°μ‚°μž`λŠ” μ˜€λ²„λ‘œλ”©ν•˜κ³ μž ν•˜λŠ” μ—°μ‚°μžλ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. λ§€κ°œλ³€μˆ˜λŠ” ν•΄λ‹Ή μ—°μ‚°μžμ˜ ν”Όμ—°μ‚°μžλ“€μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.



μ—°μ‚°μž μ˜€λ²„λ‘œλ”©μ˜ μ˜ˆμ‹œλ₯Ό μ•Œμ•„λ³΄μ‹œμ£ .



이항 μ—°μ‚°μž μ˜€λ²„λ‘œλ”©

// + μ—°μ‚°μž μ˜€λ²„λ‘œλ”© μ˜ˆμ‹œ (벑터 λ§μ…ˆ)
class Vector {
public:
    int x, y;
    Vector() : x(0), y(0) {}
    Vector(int _x, int _y) : x(_x), y(_y) {}

    Vector operator+(const Vector& other) const {
        return Vector(x + other.x, y + other.y);
    }
};

int main() {
    Vector v1(1, 2);
    Vector v2(3, 4);

    Vector result = v1 + v2; // μ‚¬μš©μž μ •μ˜λœ + μ—°μ‚°μžλ₯Ό 톡해 벑터 λ§μ…ˆ μˆ˜ν–‰

    return 0;
}

 



단항 μ—°μ‚°μž μ˜€λ²„λ‘œλ”©

// - μ—°μ‚°μž μ˜€λ²„λ‘œλ”© μ˜ˆμ‹œ (벑터 λΆ€ν˜Έ λ°˜μ „)
class Vector {
public:
    int x, y;
    Vector() : x(0), y(0) {}
    Vector(int _x, int _y) : x(_x), y(_y) {}

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

int main() {
    Vector v1(1, 2);

    Vector result = -v1; // μ‚¬μš©μž μ •μ˜λœ - μ—°μ‚°μžλ₯Ό 톡해 벑터 λΆ€ν˜Έ λ°˜μ „ μˆ˜ν–‰

    return 0;
}

 



비ꡐ μ—°μ‚°μž μ˜€λ²„λ‘œλ”©

// == μ—°μ‚°μž μ˜€λ²„λ‘œλ”© μ˜ˆμ‹œ (벑터 비ꡐ)
class Vector {
public:
    int x, y;
    Vector() : x(0), y(0) {}
    Vector(int _x, int _y) : x(_x), y(_y) {}

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

int main() {
    Vector v1(1, 2);
    Vector v2(1, 2);

    if (v1 == v2) {
        // μ‚¬μš©μž μ •μ˜λœ == μ—°μ‚°μžλ₯Ό 톡해 벑터 비ꡐ μˆ˜ν–‰
    }

    return 0;
}

 

 

정렬에 ν•„μš”ν•œ λΉ„κ΅μ—°μ‚°μž μ˜€λ²„λ‘œλ”©

C++의 std::map은 기본적으둜 keyλ₯Ό μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•©λ‹ˆλ‹€. λ”°λΌμ„œ keyκ°€ μ‚¬μš©μž μ •μ˜ 클래슀인 경우, std::mapμ—μ„œ keyλ₯Ό μ œλŒ€λ‘œ μ •λ ¬ν•˜κΈ° μœ„ν•΄ μ—°μ‚°μž μ˜€λ²„λ‘œλ”©μ΄ ν•„μš”ν•©λ‹ˆλ‹€. std::map은 keyλ₯Ό λΉ„κ΅ν•˜κΈ° μœ„ν•΄ 비ꡐ μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜λ©°, λ”°λΌμ„œ ν•΄λ‹Ή 비ꡐ μ—°μ‚°μžλ₯Ό μ‚¬μš©μž μ •μ˜ ν΄λž˜μŠ€μ— μ˜€λ²„λ‘œλ”©ν•΄μ•Ό ν•©λ‹ˆλ‹€.


#include <iostream>
#include <map>
#include <string>

class Person {
public:
    std::string name;
    int age;

    // μƒμ„±μž
    Person(const std::string& _name, int _age) : name(_name), age(_age) {}

    // 비ꡐ μ—°μ‚°μž μ˜€λ²„λ‘œλ”© (<)
    bool operator<(const Person& other) const {
        // 이름(name)을 κΈ°μ€€μœΌλ‘œ μ •λ ¬
        return name < other.name;
    }

    // 비ꡐ μ—°μ‚°μž μ˜€λ²„λ‘œλ”© (==)
    bool operator==(const Person& other) const {
        // 이름(name)κ³Ό λ‚˜μ΄(age)κ°€ λͺ¨λ‘ 같을 λ•Œ trueλ₯Ό λ°˜ν™˜
        return name == other.name && age == other.age;
    }
};

int main() {
    std::map<Person, int> personMap;

    Person person1("Alice", 30);
    Person person2("Bob", 25);
    Person person3("Alice", 35);

    // std::map에 μ‚½μž…
    personMap[person1] = 1;
    personMap[person2] = 2;
    personMap[person3] = 3;

    // 좜λ ₯ κ²°κ³Ό: (Alice, 30): 1 (Alice, 35): 3 (Bob, 25): 2
    for (const auto& entry : personMap) {
        std::cout << "(" << entry.first.name << ", " << entry.first.age << "): " << entry.second << std::endl;
    }

    return 0;
}



μœ„μ˜ μ˜ˆμ‹œμ—μ„œ Person ν΄λž˜μŠ€λŠ” 이름(name)κ³Ό λ‚˜μ΄(age)λΌλŠ” 두 κ°€μ§€ 멀버 λ³€μˆ˜λ₯Ό κ°€μ§€κ³  μžˆμŠ΅λ‹ˆλ‹€. Person 클래슀의 비ꡐ μ—°μ‚°μž `<`와 `==`λ₯Ό μ •μ˜ν•˜μ—¬ 이름(name)을 κΈ°μ€€μœΌλ‘œ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬λ˜λ„λ‘ ν•˜κ³ , `==` μ—°μ‚°μžλ₯Ό 톡해 두 개의 Person 객체가 같은지 λΉ„κ΅ν•©λ‹ˆλ‹€.

std::map이 keyλ₯Ό μ •λ ¬ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ΄λŸ¬ν•œ 비ꡐ μ—°μ‚°μž μ˜€λ²„λ‘œλ”©μ΄ ν•„μš”ν•˜λ©°, ν•„μš”μ— 따라 keyλ₯Ό 비ꡐ할 λ•Œ λ‹€λ₯Έ κΈ°μ€€μœΌλ‘œ μ •λ ¬ν•˜λ„λ‘ 비ꡐ μ—°μ‚°μžλ₯Ό μˆ˜μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

정리

μ—°μ‚°μž μ˜€λ²„λ‘œλ”©μ€ C++μ—μ„œ κ°•λ ₯ν•œ κΈ°λŠ₯μ΄μ§€λ§Œ, μ˜€μš©ν•  경우 μ½”λ“œμ˜ 가독성을 μ €ν•˜μ‹œν‚€κ³  ν˜Όλž€μ„ μ•ΌκΈ°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ‹€λ₯Έ λŒ€λΆ€λΆ„μ˜ 언어에 μ—°μ‚°μž μ˜€λ²„λ‘œλ”©μ΄ μ—†λŠ” μ΄μœ μž…λ‹ˆλ‹€.

λ”°λΌμ„œ μ‚¬μš©μž μ •μ˜ ν΄λž˜μŠ€μ— μ—°μ‚°μž μ˜€λ²„λ‘œλ”©μ„ μΆ”κ°€ν•  λ•ŒλŠ” λͺ…ν™•ν•˜κ³  의미 μžˆλŠ” λ™μž‘μ„ μ œκ³΅ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€. λ˜ν•œ 일뢀 μ—°μ‚°μžμ— λŒ€ν•΄ μ˜€λ²„λ‘œλ”©μ„ μ§€μ›ν•˜μ§€ μ•Šκ±°λ‚˜, νŠΉμ • κ·œμΉ™μ„ λ”°λ₯΄λŠ” κ²½μš°λ„ μžˆμœΌλ―€λ‘œ μ΄λŸ¬ν•œ 사항을 λ¬Έμ„œλ‚˜ μ£Όμ„μœΌλ‘œ λͺ…μ‹œν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.