์ฐ์ฐ์ ์ค๋ฒ๋ก๋ฉ(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++์์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ด์ง๋ง, ์ค์ฉํ ๊ฒฝ์ฐ ์ฝ๋์ ๊ฐ๋ ์ฑ์ ์ ํ์ํค๊ณ ํผ๋์ ์ผ๊ธฐํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ๋๋ถ๋ถ์ ์ธ์ด์ ์ฐ์ฐ์ ์ค๋ฒ๋ก๋ฉ์ด ์๋ ์ด์ ์ ๋๋ค.
๋ฐ๋ผ์ ์ฌ์ฉ์ ์ ์ ํด๋์ค์ ์ฐ์ฐ์ ์ค๋ฒ๋ก๋ฉ์ ์ถ๊ฐํ ๋๋ ๋ช ํํ๊ณ ์๋ฏธ ์๋ ๋์์ ์ ๊ณตํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋ํ ์ผ๋ถ ์ฐ์ฐ์์ ๋ํด ์ค๋ฒ๋ก๋ฉ์ ์ง์ํ์ง ์๊ฑฐ๋, ํน์ ๊ท์น์ ๋ฐ๋ฅด๋ ๊ฒฝ์ฐ๋ ์์ผ๋ฏ๋ก ์ด๋ฌํ ์ฌํญ์ ๋ฌธ์๋ ์ฃผ์์ผ๋ก ๋ช ์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋๊ธ