๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
C++ ๊ธฐ์ดˆ

[C++] 19. ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ(Operator Overloading)

by ์„œ์•„๋ž‘๐Ÿ˜ 2023. 8. 7.

 

 

 

์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ(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++์—์„œ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์ด์ง€๋งŒ, ์˜ค์šฉํ•  ๊ฒฝ์šฐ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ์ €ํ•˜์‹œํ‚ค๊ณ  ํ˜ผ๋ž€์„ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋Œ€๋ถ€๋ถ„์˜ ์–ธ์–ด์— ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ์ด ์—†๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž ์ •์˜ ํด๋ž˜์Šค์— ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋Š” ๋ช…ํ™•ํ•˜๊ณ  ์˜๋ฏธ ์žˆ๋Š” ๋™์ž‘์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ผ๋ถ€ ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•ด ์˜ค๋ฒ„๋กœ๋”ฉ์„ ์ง€์›ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜, ํŠน์ • ๊ทœ์น™์„ ๋”ฐ๋ฅด๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์œผ๋ฏ€๋กœ ์ด๋Ÿฌํ•œ ์‚ฌํ•ญ์„ ๋ฌธ์„œ๋‚˜ ์ฃผ์„์œผ๋กœ ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋Œ“๊ธ€