본문 바로가기

C++/C++ 문법

[C++] 연산자 오버로딩 (멤버함수와 전역함수에 의한 연산자 오버로딩)

728x90
반응형

연산자 오버로딩

 

연산자 오버로딩은 주로 클래스를 다룰 때 함께 사용한다.

 

다음과 같은 코드를 작동시켰을 때에는 제대로 동작하지 않는다.

 

#include <iostream>

class Pos
{
private:
    int x = 10;
    int y = 10;
};

int main()
{
    Pos a;
    Pos b;
    Pos c = a + b;
    return 0;
}

 

 

그러나 위 코드를 생성자와 연산자 오버로딩을 통해 정상적으로 동작하게 만들 수 있다.

+ 연산자에 대해서 재정의를 해주는 것이다.

 

    Pos(int x, int y) {
        this->x = x;
        this->y = y;
    }
    Pos operator+(const Pos& a)
    {
        Pos PlusPos(x + a.x, y + a.y);
        return PlusPos;
    }

 

클래스 내부에 다음과 같은 코드를 추가해 주면 된다.

 

최종적인 코드는 아래와 같다.

 

#include <iostream>

class Pos
{
private:
    int x = 10;
    int y = 10;
public:
    Pos() { }
    Pos(int x, int y) {
        this->x = x;
        this->y = y;
    }
    Pos operator+(const Pos& a)
    {
        Pos PlusPos(x + a.x, y + a.y);
        return PlusPos;
    }
};

 

 

 

 

연산자 오버로딩의 사용

 

위와 같이 코드를 작성했다면 아래와 같이 사용하는 것이 가능하다.

 

    Pos a;
    Pos b;
    Pos c = a + b;
    Pos d = a.operator+(b);

 

a.operator+(b)는 컴파일러가 a+b로 변환하여 동작하기 때문에 위 두 가지 코드 모두 사용이 가능하다.

 

 

 

 

전역함수에 의한 연산자 오버로딩

 

연산자를 오버로딩할 때 위 내용처럼 멤버함수를 사용할 수도 있고 전역함수를 사용할 수도 있다.

 

전역함수를 사용하여 오버로딩하는 방법은 아래 코드와 같다.

 

class Pos {
private:
	int x;
	int y;
public:
	Pos(int x1 = 0, int y1 = 0) : x(x1), y(y1) { }
	friend Pos operator+(const Pos& pos1, const Pos& pos2);
};
Pos operator+(const Pos& pos1, const Pos& pos2)
{
	Pos pos(pos1.x + pos2.x, pos1.y + pos2.y);
	return pos;
}

 

전역함수로 연산자 오버로딩을 구현할 경우 함수가 특정 객체의 멤버가 아니기 때문에 연산할 객체를 모두 명시적으로

전달받아야 한다.

따라서 멤버함수로 오버로딩을 구현했을 때와는 다르게 매개변수를 2개 요구한다.

 

 

 

전역함수에 의한 연산자 오버로딩의 사용

 

전역함수로 연산자 오버로딩을 구현하였을 경우 아래 코드처럼 사용이 가능하다.

 

    Pos a;
    Pos b;
    Pos c = a + b;
    Pos d = operator+(a, b);

 

멤버함수로 연산자 오버로딩을 구현했을 때와 마찬가지로 Pos c a + b; 의 형태로 사용하는 것은 동일하지만

멤버함수로 구현했을 경우 Pos d = a.operator+(b); 의 형태로 사용한 것과 다르게

Pos d = operator+(a, b); 의 형태로 사용해야 한다.

 

 

동일한 자료형에 대해서 멤버함수와 전역함수로 동시에 오버로딩 했을 경우 멤버함수로 오버로딩된 함수가 우선시 출력되지만 이런 상황은 가급적 만들지 않는 것이 좋다.

 

 

 

 

const 선언

 

연산자 오버로딩을 사용할 때에는 함수와 매개변수에 const 선언을 추가해 주는 것이 좋다.

 

연산을 할 때에는 값을 변경하는 것이 아니라 새로운 값을 만드는 것이기 때문이다.

 

    Pos operator+(const Pos& a) const
    {
        Pos PlusPos(x + a.x, y + a.y);
        return PlusPos;
    }

 

 

 

 

오버로딩 불가능 연산자

 

+ 연산자를 오버로딩한 것과 마찬가지 방법으로 산술연산자, 증감연산자 등 여러 연산자를 오버로딩 하는 것이 가능하다.

 

아래 연산자들은 오버로딩 하는 것이 불가능하다.

 

멤버 접근 연산자

.

멤버 포인터 연산자

.*

범위 지정 연산자

::

조건 연산자 (3항 연산자)

?:

바이트 단위 크기 계산

sizeof

RTTI 관련 연산자

typeid

형변환 연산자

static_cast

dynamic_cast

const_cast

reinterpret_cast

 

위 연산자들은 딱히 오버로딩해야 하는 상황이 없으며 오버로딩을 허용할 경우 C++ 문법에 어긋나는 코딩이 가능해진다.

 

 

 

그 밖에도 오버로딩 가능한 연산자들로는

대입연산자

=

함수 호출 연산자

()

배열 접근 연산자

[]

멤버 접근 포인터 연산자

->

 

등이 있다.

 

 

 

 

 

728x90
반응형