[c++] 연산자 오버로딩의 적절한 사용 예
연산자 오버로딩은 사용자 정의 자료형에 대해 내부적으로 정의한 연산자들의 동작을 변경하거나 추가하는 기능입니다. 이를 통해 새로운 형태의 연산자나 다른 의미를 지닌 연산자를 정의할 수 있습니다.
특수한 형태의 연산자 오버로딩
특정한 클래스에 대해 +
, -
, *
와 같은 산술 연산자 뿐만 아니라, []
나 ()
와 같은 연산자들을 정의하여 해당 클래스 객체에 대한 조작을 보다 직관적으로 할 수 있습니다.
class Matrix {
// ...
public:
// 행렬 덧셈
Matrix operator+(const Matrix& other) {
// ...
}
// 행렬 곱셈
Matrix operator*(const Matrix& other) {
// ...
}
// 행렬의 특정 요소 접근
int& operator()(int row, int col) {
// ...
}
// 행렬의 특정 행 반환
int* operator[](int index) {
// ...
}
};
유용한 형태의 연산자 오버로딩
특수한 형태의 연산자 오버로딩 외에도, 개발자의 편의를 위해 연산자를 오버로딩할 수 있습니다. 예를 들어, 크기 비교 연산자, 스트림 입출력 연산자 등을 재정의하여 더 편리한 형태의 클래스를 제공할 수 있습니다.
class Fraction {
int num, den;
public:
// 분수의 크기 비교
bool operator<(const Fraction& other) {
// ...
}
// 스트림 출력 연산자 오버로딩
friend ostream& operator << (ostream& os, const Fraction& frac) {
os << frac.num << "/" << frac.den;
return os;
}
};
연산자 오버로딩은 어떤 클래스에 대해 좀 더 직관적인 연산을 가능하게 해주고, 편리하고 유연한 사용을 제공하는 것으로 볼 수 있습니다.
결론
연산자 오버로딩을 적절하게 사용하면 의도하지 않은 버그를 막고, 코드의 가독성 및 사용자 경험을 향상시킬 수 있습니다. 하지만 과용은 코드를 혼란스럽게 할 수 있으므로, 신중하게 사용할 필요가 있습니다.