[c++] 연산자 오버로딩과 다형성

C++은 다른 프로그래밍 언어와는 다르게 연산자를 오버로딩할 수 있는 특징을 가지고 있습니다. 연산자 오버로딩은 사용자 정의 자료형에 대한 새로운 연산자 동작을 정의할 수 있게 해줍니다. 또한, C++은 다형성을 지원하여 같은 연산자를 서로 다르게 구현한 여러 함수 오버로딩을 가질 수 있습니다.

연산자 오버로딩 (Operator Overloading)

C++에서 연산자 오버로딩은 이미 정의된 연산자에 새로운 동작을 정의하는 것을 의미합니다. 예를 들어, 사용자 정의 클래스에 + 연산자가 사용될 때 클래스 객체 간의 덧셈 연산을 정의할 수 있습니다.

다음은 + 연산자를 오버로딩하는 예제입니다:

class Complex {
private:
    float real;
    float imaginary;
public:
    Complex(float r, float i) : real(r), imaginary(i) {}
    Complex operator+(const Complex& c) {
        return Complex(real + c.real, imaginary + c.imaginary);
    }
};

위 예제에서 + 연산자를 오버로딩하여 두 개의 복소수를 더하는 동작을 정의했습니다. 이제 Complex 클래스 객체 간에 + 연산자를 사용하여 덧셈을 수행할 수 있습니다.

다형성 (Polymorphism)

C++은 다형성을 지원하여 같은 이름의 함수 또는 연산자를 여러 형태로 구현할 수 있습니다. 이를 통해 코드의 재사용성을 높이고 유지보수를 용이하게 할 수 있습니다.

다음은 다형성을 이용한 연산자 오버로딩의 예제입니다:

class Shape {
public:
    virtual void draw() {
        std::cout << "Drawing a shape" << std::endl;
    }
};

class Circle : public Shape {
public:
    void draw() override {
        std::cout << "Drawing a circle" << std::endl;
    }
};

class Square : public Shape {
public:
    void draw() override {
        std::cout << "Drawing a square" << std::endl;
    }
};

위 예제에서 Shape 클래스의 draw 함수를 가상 함수로 선언하였고, CircleSquare 클래스에서 이를 오버라이딩하여 각 도형에 맞는 동작을 정의하였습니다.

이렇게 함으로써 다형성을 통해 draw 함수를 호출할 때 실제 객체의 타입에 따라 적절한 동작을 실행할 수 있습니다.

C++의 연산자 오버로딩과 다형성을 사용하면 프로그램의 유연성과 확장성을 높일 수 있습니다. 이를 통해 더 재사용 가능하고 유지보수가 용이한 코드를 작성할 수 있습니다.


참고 자료: