본문 바로가기

Archived(CSE Programming)/cpp

Chap 10. 연산자의 오버로딩 1

Chap 10. 연산자의 오버로딩 1


10-1.연산자 오버로딩의 이해와 유형


연산자 오버로딩이란 cpp 내에서 사용할 수 있는 연산자를 객체들 간에서도 사용할 수 있도록 하는 것이다.

가령, Point pos1 = pos2 + pos3; 와 같은 형태로 객체 간의 덧셈에 대해서 연산을 규정할 수 있다.


방법은 다음과 같이 멤버함수, 전역함수 두 가지의 방법이 있고 operator연산자 함수를 오버로딩하여 사용하면 된다.


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
class Point{
private:
    int xpos;
    int ypos;
public:
    Point(int x, int y) :xpos(x),ypos(y){}
    // 멤버함수 연산자 오버로딩
    Point operator+(const Point & pos2){
        Point obj(xpos+pos2.xpos, ypos+pos2.ypos);
        return obj
    }
    friend Point operator+(const Point pos1, const Point pos2);
};
 
// 전역함수 연산자 오버로딩
friend Point operator+(const Point & pos1, const Point & pos2){
    Point obj(pos1.xpos+pos2.xpos, pos1.yos+pos2.ypos);
    return obj;
}
 
void main(){
    Point pos1(1,2);
    Point pos2(3,4);
 
    Point pos3 = pos1+pos2; // pos3 -> (4,6)
    Point pos4 = pos1.operator+(pos2); // pos1+pos2 와 동일
    Point pos5 = operator+(pos1,pos2); // pos1+pos2 와 동일
}
cs


여기서 연산자 오버로딩은 본래 기능의 큰 틀을 벗어나지 않게 하기 등의 여러 주의점이 있으므로 신중히 사용하여야 한다.


10-2. 단항 연산자의 오버로딩


증감 연산과 같이 단항 연산자도 오버로딩이 필요할 수 있는데 증감 연산은 전위와 후위 두 가지가 있다.

그렇지만 똑같이 ++, -- 연산이기에 이를 구분하기 위해 매개변수에 int 형을 추가해서 오버로딩하여 컴파일러가 구분할 수 있도록 한다.

그리고, 전위 연산은 계속 진행할 수 있도록 참조형을 반환해주도록 하고, 후위 연산은 한번만 진행할 수 있도록 const 선언 후 객체를 반환한다.


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
class Point{
    ...
    // 후위 증가
    const Point operator++(int){
        const Point obj(xpos,ypos);
        xpos+=1;
        ypos+=1;
        return obj;
    }
    // 전위 증가
    Point & operator++(){
        xpos+=1;
        ypos+=1;
        return *this// 다시금 ++(++pos)와 같은 형태 허용하기 위해 포인터 반환
    }
    friend Point & operator--(Point &);
    friend const Point operator--(Point & ,int);
};
 
// 전위 감소
friend Point & operator--(Point & pos){
    pos.xpos-=1;
    pos.ypos-=1;
    return pos;
}
 
// 후위 감소
friend const Point operator--(Point & pos,int){
    const Point obj(pos.xpos,pos.ypos);
    xpos-=1;
    ypos-=1;
    return obj;
}
cs


10-3. 교환법칙 문제의 해결


자료형이 다른 두 형태의 연산자 오버로딩도 마찬가지로 구현하면된다.

단, 3 + pos1 과 같이 기본자료형이 앞에 오는 경우처럼 교환법칙을 고려하여

전역함수에 위의 연산자 오버로딩을 구현해주어야 한다.


10-4. cout, cin 그리고 endl의 정체


cout과 cin에서 사용하는 <<, >> 연산자들도 마찬가지로 연산자 오버로딩이다.

연산자 오버로딩을 통하여 printf와 scanf 를 허용하고 있는 것이며 cout<<1<<3<<endl; 과 같이 계속 연산을 이어갈 수 있도록 return 객체 참조값을 반환해주어야 한다.