본문 바로가기
-----ETC-----/C++ 마스터 시리즈

[C++ 마스터] Day 14: 연산자 오버로딩

by cogito21_cpp 2024. 8. 1.
반응형

연산자 오버로딩 (Operator Overloading)

연산자 오버로딩은 기존의 C++ 연산자를 사용자 정의 타입(클래스)에 대해 재정의하는 기능입니다. 이를 통해 객체 간의 연산을 보다 직관적으로 수행할 수 있습니다.

 

1. 기본 개념

연산자 오버로딩은 함수 형태로 정의되며, 클래스의 멤버 함수 또는 전역 함수로 구현할 수 있습니다.

 

2. 멤버 함수로 연산자 오버로딩

연산자를 멤버 함수로 오버로딩하는 방법은 다음과 같습니다:

class Complex {
private:
    double real;
    double imag;

public:
    Complex(double r = 0, double i = 0) : real(r), imag(i) {}

    // + 연산자 오버로딩
    Complex operator + (const Complex &c) {
        return Complex(real + c.real, imag + c.imag);
    }

    void display() {
        cout << "Real: " << real << ", Imag: " << imag << endl;
    }
};

int main() {
    Complex c1(3.0, 4.0);
    Complex c2(1.0, 2.0);
    Complex c3 = c1 + c2;
    c3.display();  // Real: 4.0, Imag: 6.0 출력

    return 0;
}

 

3. 전역 함수로 연산자 오버로딩

연산자를 전역 함수로 오버로딩하는 방법은 다음과 같습니다:

class Complex {
private:
    double real;
    double imag;

public:
    Complex(double r = 0, double i = 0) : real(r), imag(i) {}

    // 전역 함수로 + 연산자 오버로딩
    friend Complex operator + (const Complex &c1, const Complex &c2);

    void display() {
        cout << "Real: " << real << ", Imag: " << imag << endl;
    }
};

Complex operator + (const Complex &c1, const Complex &c2) {
    return Complex(c1.real + c2.real, c1.imag + c2.imag);
}

int main() {
    Complex c1(3.0, 4.0);
    Complex c2(1.0, 2.0);
    Complex c3 = c1 + c2;
    c3.display();  // Real: 4.0, Imag: 6.0 출력

    return 0;
}

 

4. 입출력 연산자 오버로딩

<<>> 연산자를 오버로딩하여 객체의 입출력을 지원할 수 있습니다:

class Complex {
private:
    double real;
    double imag;

public:
    Complex(double r = 0, double i = 0) : real(r), imag(i) {}

    // << 연산자 오버로딩
    friend ostream& operator << (ostream &out, const Complex &c);

    // >> 연산자 오버로딩
    friend istream& operator >> (istream &in, Complex &c);
};

ostream& operator << (ostream &out, const Complex &c) {
    out << "Real: " << c.real << ", Imag: " << c.imag;
    return out;
}

istream& operator >> (istream &in, Complex &c) {
    cout << "Enter real part: ";
    in >> c.real;
    cout << "Enter imaginary part: ";
    in >> c.imag;
    return in;
}

int main() {
    Complex c1;
    cin >> c1;
    cout << c1 << endl;

    return 0;
}

 

예제 문제

문제 1: 2D 벡터 클래스 작성 및 + 연산자 오버로딩

2D 벡터를 나타내는 클래스를 작성하고, + 연산자를 오버로딩하여 두 벡터의 합을 계산하는 프로그램을 작성하세요.

 

해설:

#include <iostream>

using namespace std;

class Vector2D {
private:
    double x;
    double y;

public:
    Vector2D(double x = 0, double y = 0) : x(x), y(y) {}

    // + 연산자 오버로딩
    Vector2D operator + (const Vector2D &v) {
        return Vector2D(x + v.x, y + v.y);
    }

    void display() {
        cout << "X: " << x << ", Y: " << y << endl;
    }
};

int main() {
    Vector2D v1(1.0, 2.0);
    Vector2D v2(3.0, 4.0);
    Vector2D v3 = v1 + v2;
    v3.display();  // X: 4.0, Y: 6.0 출력

    return 0;
}

 

이 프로그램은 2D 벡터 클래스를 작성하고, + 연산자를 오버로딩하여 두 벡터의 합을 계산합니다.

 

문제 2: 복소수 클래스 작성 및 == 연산자 오버로딩

복소수를 나타내는 클래스를 작성하고, == 연산자를 오버로딩하여 두 복소수가 같은지 비교하는 프로그램을 작성하세요.

 

해설:

#include <iostream>

using namespace std;

class Complex {
private:
    double real;
    double imag;

public:
    Complex(double r = 0, double i = 0) : real(r), imag(i) {}

    // == 연산자 오버로딩
    bool operator == (const Complex &c) {
        return (real == c.real && imag == c.imag);
    }

    void display() {
        cout << "Real: " << real << ", Imag: " << imag << endl;
    }
};

int main() {
    Complex c1(3.0, 4.0);
    Complex c2(3.0, 4.0);
    Complex c3(1.0, 2.0);

    if (c1 == c2) {
        cout << "c1 is equal to c2" << endl;
    } else {
        cout << "c1 is not equal to c2" << endl;
    }

    if (c1 == c3) {
        cout << "c1 is equal to c3" << endl;
    } else {
        cout << "c1 is not equal to c3" << endl;
    }

    return 0;
}

 

이 프로그램은 복소수 클래스를 작성하고, == 연산자를 오버로딩하여 두 복소수가 같은지 비교합니다.

 

문제 3: 3D 점 클래스 작성 및 << 연산자 오버로딩

3D 점을 나타내는 클래스를 작성하고, << 연산자를 오버로딩하여 점의 좌표를 출력하는 프로그램을 작성하세요.

 

해설:

#include <iostream>

using namespace std;

class Point3D {
private:
    double x;
    double y;
    double z;

public:
    Point3D(double x = 0, double y = 0, double z = 0) : x(x), y(y), z(z) {}

    // << 연산자 오버로딩
    friend ostream& operator << (ostream &out, const Point3D &p);
};

ostream& operator << (ostream &out, const Point3D &p) {
    out << "X: " << p.x << ", Y: " << p.y << ", Z: " << p.z;
    return out;
}

int main() {
    Point3D p1(1.0, 2.0, 3.0);
    cout << p1 << endl;

    Point3D p2(4.0, 5.0, 6.0);
    cout << p2 << endl;

    return 0;
}

 

이 프로그램은 3D 점 클래스를 작성하고, << 연산자를 오버로딩하여 점의 좌표를 출력합니다.

 

다음 단계

14일차의 목표는 C++의 연산자 오버로딩에 대해 학습하는 것이었습니다. 다음 날부터는 상속과 다형성에 대해 다룰 것입니다.

 

내일은 "상속과 다형성"에 대해 다룰 예정입니다. 질문이나 피드백이 있으면 댓글로 남겨 주세요!

반응형