연산자 오버로딩은 오버로딩의 확장형 개념이다. 프로그래머가 만든 함수를 오버로딩하듯 연산자(+,-,++)를 클래스에서 오버로딩하여 사용할 수 있다. 필자가 이해한 바로는 +,-와 같은 연산자를 함수 이름처럼 사용할 수 있다. 전에 공부할때는 그냥 함수 만들어서 쓰고말지 싶었는데, 쓰면 코드 난독화할때 좋을것 같아서 다시 공부했다.


Basic Class

연산자 오버로딩을 설명하기위해 등장한 클래스이다. 먼저 Basic Class는 아래와 같이 생성했다. baisc_class는 x,y라는 멤버 변수를 가지고 있다.

1
2
3
4
5
6
7
8
9
10
#include <iostream>

class basic_class
{
    int x;
    int y;
public:
    basic_class() { x = 0; y = 0; }
    basic_class(int m, int n) :x(m), y(n) {}
};

만약 멤버 변수 두개에 일정 정수를 더하는 아주 일반적인 멤버 함수를 만든다면 아래와 같이 만들게 될 것이다.

1
2
3
4
5
6
7
8
9
class basic_class
{
    ...
    void add(int i)
    {
        x += i;
        y += i;
    }
};

연산자 오버로딩으로 생성하면 아래처럼 만들 수 있다.

1
2
3
4
5
6
7
8
9
10
class basic_class
{
    ...
    basic_class operator+(int i)
    {
        x += i;
        y += i;
        return *this;
    }
};

함수는 selfref operator<연산자>(보조변수) 와 같은 형식으로 생성한다.


두 함수의 차이점

두 함수는 실질적으로 같은 기능을 수행한다. 차이점은 진입점에서 호출하는 방법이 다르다.

1
2
3
4
5
6
7
8
int main(void)
{
    basic_class bc(10, 20);
    basic_class cc;
    cc.add(3);
    cc = bc + 3;
    return 0;
}

5행과 6행은 우리가 만들었던 같은 기능을 하는 함수다. 이처럼 우리가 직접 만든 클래스에도 다형성을 지원할 수 있는 것이 연산자 오버로딩이다. 위에서 나와있듯이 ‘+’라는 연산자를 함수 호출 하듯이 사용할 수 있게 되었다.


연산자 오버로딩 오버로딩

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class basic_class
{
    int x;
    int y;
public:
    basic_class() { x = 0; y = 0; }
    basic_class(int m, int n) :x(m), y(n) {}
    void add(int i)
    {
        x += i;
        y += i;
    }
    basic_class operator+(int i)
    {
        x += i;
        y += i;
        return *this;
    }
    basic_class operator+(basic_class x1)
    {
        x += x1.x;
        y += x1.y;
        return *this;
    }
    basic_class operator++(int)
    {
        x++;
        y++;
        return *this;
    }
    void pt()
    {
        printf("%d %d\n", x, y);
    }
};

오버로딩된 연산자의 보조 변수를 바꿔서 오버로딩(13행 19행) 할 수 있어서 클래스간의 덧셈도 할 수 있게 만들 수 있고, ++연산자(25행)역시 오버로딩하여 사용할 수 있다.


실행 및 결과값

1
2
3
4
5
6
7
8
9
10
11
12
13
int main(void)
{
    basic_class bc(10, 20);
    basic_class cc;
    cc.pt();
    cc = bc + bc;
    cc.pt();
    cc = bc + 3;
    cc.pt();
    cc++;
    cc.pt();
    return 0;
}
1
2
3
4
5
0 0
20 40
23 43
24 44
계속하려면 아무 키나 누르십시오 . . .

물론 모든 연산자가 다 오버로딩 되는것은 아니다. .(멤버 연산지) .*(멤버 지시 포인터 연산자) ::(사용 범위 결정 연산자) ?:(조건 연산자)는 연산자 오버로딩을 사용할 수 없다.

그리고 =(대입 연산자) ()(함수 호출 연산자) ->(클래스 멤버 접근 포인터 연산자)등은 오버로딩 하는데 멤버 함수만 사용할 수 있다. 또 연산자 기호는 자신이 새로 만들 수 없다.

WRITTEN BY

배진오

소비적인 일보단 생산적인 일을 추구하며, 좋아하는 일을 잘하고 싶어합니다 :D
im@baejino.com