[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;
    }
};

연산자 오버로딩은 어떤 클래스에 대해 좀 더 직관적인 연산을 가능하게 해주고, 편리하고 유연한 사용을 제공하는 것으로 볼 수 있습니다.

결론

연산자 오버로딩을 적절하게 사용하면 의도하지 않은 버그를 막고, 코드의 가독성 및 사용자 경험을 향상시킬 수 있습니다. 하지만 과용은 코드를 혼란스럽게 할 수 있으므로, 신중하게 사용할 필요가 있습니다.