본문 바로가기

코딩 테크닉/C 코드 테크닉

C++ 연산자 오버로딩

반응형

연산자 오버로딩(Operator Overloading) ::

ㄴ 객체 지향 언어에서 사용되는 개념임.
ㄴ 기존의 연산자를 클래스나 구조체 등의 사용자 정의 타입에 맞게 재정의함.
ㄴ 사용자 정의 타입의 객체들간의 연산을 수행할 수 있음.

 

 

#include <iostream>

class Vector2D {
private:
    double M = 77.20;
    double N = 44.52;

public:
    double x;
    double y;

    Vector2D(double x_data, double y_data) : x(x_data), y(y_data) {}

    Vector2D operator+(const Vector2D& other) const {
        return Vector2D(x + other.x, y + other.y);
    }

    double Sum() const {
        return M + N;
    }
};

int main() {
    Vector2D v1(1.01, 2.36);
    Vector2D v2(0.01, 0.05);
    Vector2D v3 = v1 + v2;

    std::cout << "v1'x: " << v1.x << std::endl;
    std::cout << "v1'y: " << v1.y << std::endl;
    
    std::cout << "v2'x: " << v2.x << std::endl;
    std::cout << "v2'y: " << v2.y << std::endl;
    
    std::cout << "v3'x: " << v3.x << std::endl;
    std::cout << "v3'y: " << v3.y << std::endl;

    std::cout << "Sum(): " << v3.Sum() << std::endl;
    return 0;
}

 

    public: 
        double x; 
        double y;

 

클래스 정의에서 public을 private로 선언하면 아래와 같이 private 구조체 호출에서 에러가 발생함.

calling a private constructor of class 'Vector2D' Vector2D v1(1.01, 2.36);

 

물론, private를 사용해서 클래스에서 사용하는 변수 선언은 가능하다.

 

 

Vector2D(double x_data, double y_data) : x(x_data), y(y_data) {}

ㄴ C++에서 생성자를 정의하는 부분임.
ㄴ 생성자는 객체가 생성될 때 "객체의 초기화'를 담당함.
ㄴ 생성자는 x_data, y_data를 매개변수로 받아들여 x, y 멤버변수를 초기화함.

 

여기서 사용된 : x(x_data), y(y_data) 부분은 초기화 리스트(init list)라고 한다.

생성자들의 선언 뒤에 콜론(:)을 붙이고 그 뒤에 초기화하려는

멤버 변수와 초기화할 값들을 나열하는 형태로 구성한다.

x(x_data), y(y_data)는 x변수를 x_data로, y변수를 y_data로 초기화한다.


 Vector2D operator+(const Vector2D& other) const {
        return Vector2D(x + other.x, y + other.y);
    }

 

위 코드가 연산자중 (+)를 오버로딩하는 함수다.
Ventor2D 클래스 객체에 대해 두 객체를 더한 결과를 리턴한다.

operator+ 이 함수가 연산자 오버로딩 함수다.
const Vector2D& other 함수는  Vector2D 객체를 인자로 받는다.

const 참조로 받는다는 의미는 객체 변경없이 받는다는 의미다.

 

main() 함수에서

    Vector2D v1(1.01, 2.36);
    Vector2D v2(0.01, 0.05);
    Vector2D v3 = v1 + v2;

와 같이 정의할 수 할 수 있는 이유는   Vector2D 클래스를 받은 v1과 v2, v3를

만들고 v3에서 Vector2D v1과 Vector2D v2를 + 할 수 있다.

 

결과는 아래와 같다.

 

728x90