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

2023. 8. 7. 09:05ยทํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด/C++ ๊ธฐ์ดˆ

 

 

 

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

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

์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด > C++ ๊ธฐ์ดˆ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[C++] 21. ์Šค๋ ˆ๋“œ ๊ฒฝ์Ÿ ์ƒํƒœ(Race condition), ๋ฎคํ…์Šค(mutex), ๋ฐ๋“œ๋ฝ, std::conditional_variable, std::async  (0) 2023.08.22
[C++] 20. ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Multi-Threads)  (1) 2023.08.18
[C++] 18. Standard Library ์ •๋ณตํ•˜๊ธฐ(STL)  (1) 2023.08.06
[C++] 17. ์˜ˆ์™ธ์ฒ˜๋ฆฌ(Exception), std::exception  (1) 2023.07.23
[C++] 16-3. ์ƒ์†(Inheritance)๊ด€๊ณ„์˜ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ, ์†Œ๋ฉธ  (2) 2023.06.29
'ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด/C++ ๊ธฐ์ดˆ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [C++] 21. ์Šค๋ ˆ๋“œ ๊ฒฝ์Ÿ ์ƒํƒœ(Race condition), ๋ฎคํ…์Šค(mutex), ๋ฐ๋“œ๋ฝ, std::conditional_variable, std::async
  • [C++] 20. ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Multi-Threads)
  • [C++] 18. Standard Library ์ •๋ณตํ•˜๊ธฐ(STL)
  • [C++] 17. ์˜ˆ์™ธ์ฒ˜๋ฆฌ(Exception), std::exception
์„œ์•„๋ž‘๐Ÿ˜ƒ
์„œ์•„๋ž‘๐Ÿ˜ƒ
Just Do It๐Ÿ’ช
  • ์„œ์•„๋ž‘๐Ÿ˜ƒ
    G-Stack
    ์„œ์•„๋ž‘๐Ÿ˜ƒ
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ์ „์ฒด๋ณด๊ธฐ (144)
      • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด (78)
        • C++ ๊ธฐ์ดˆ (28)
        • C++ ์‘์šฉ (18)
        • Python (18)
        • JavaScript & NodeJS (0)
        • Go (12)
        • React & NextJS (2)
        • Java (0)
      • AI (2)
      • ์ปดํ“จํ„ฐ ๊ตฌ์กฐ & ์šด์˜์ฒด์ œ (31)
      • ์•Œ๊ณ ๋ฆฌ์ฆ˜ (12)
      • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (5)
      • ๋„คํŠธ์›Œํฌ (3)
      • ๋””์ž์ธํŒจํ„ด (5)
      • ์„œ๋น„์Šค & ํˆด (7)
      • ํŠธ๋ Œ๋“œ&์ด์Šˆ (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

    • G์Šคํƒ์˜ ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ
  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ์Šคํƒ
    ๋””์ž์ธํŒจํ„ด
    ์žฌ๊ท€
    init
    ํŒŒ์ด์ฌ
    fork
    STD
    ๋ฐ˜๋ณต๋ฌธ
    ํ•จ์ˆ˜
    cpu
    ํŒŒ์ผ์ž…์ถœ๋ ฅ
    ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
    component
    go
    ํฌ์ธํ„ฐ
    ๋ฉ”๋ชจ๋ฆฌ
    ์ƒ์†
    ๋ณ€์ˆ˜
    ๊ฐ€์ƒ๋ฉ”๋ชจ๋ฆฌ
    ํŒจํ‚ค์ง€
    ๋ฐฐ์—ด
    c
    ์กฐ๊ฑด๋ฌธ
    ์ปดํ“จํ„ฐ
    RAM
    c++
    Thread
    ์•Œ๊ณ ๋ฆฌ์ฆ˜
    pointer
    ํ•˜๋“œ๋””์Šคํฌ
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.6
์„œ์•„๋ž‘๐Ÿ˜ƒ
[C++] 19. ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ(Operator Overloading)
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”