ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 연산자 오버로딩
    카테고리 없음 2018. 12. 9. 17:03


    연산자 오버로딩이란 연산자를 사용자가 필요에 의해 재정의하는 것이다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Test{
    public:
        int value;
        Test(int _value) : value(_value){}
    }
     
     
    Test test1(1), test2(2);

    test1 + test2 //compile 에러
    cs

    Test 클래스끼리 더한 값을 알고 싶을 때,  + 연산자를 사용하면 컴파일 에러가 발생한다.

    이유는 Test 클래스에서 + 에 대한 연산자가 무슨 역할을 하는지 지정하지 않았기 때문이다.


    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
    #include <iostream>
    using namespace std;
     
    class Test{
    public:
        int value;
        Test(int _value) : value(_value){}
     
        Test operator+ (const Test &rhs){
            return Test(value + rhs.value);
        }
     
        int operator+ (const int &rhs){
            return value + rhs;
        }
    };
     
    int main(){
        Test test1(10), test2(20);
        
        //아래 두 문장은 같은 함수이다.
        Test t1 =  test1.operator+(test2);
        Test t2 =  test1 + test2;
        int sum = test1 + 20;
     
        cout << t1.value << " " << t2.value << endl;
        cout << sum;
    }
    cs

    9번째 줄과 13번째줄에서 + 연산자에 대해 정의를 했다. 

    함수 정의를 보면 일반적인 함수와 비슷하다. 

    이름만 자기가 오버로딩하고 싶은 연산자로 지정을 하고, 리턴타입과 인자을 정의하고 안에 함수 내용을 채운다. 


    위 코드의 실행결과는 

    30 30

    30 

    이다.


    문제풀이에서는 주로 < 연산자에 대해 오버로딩을  하는데, 이유는 정렬이나 우선순위큐에서 '<' 연산자를 사용해 정렬을 하기 때문이다.

    예를 들어 두 수로 이뤄진 객체가 있고 이러한 객체들이 여러개 있다고 가정한다, 그리고 객체의 두 수의 차이의 절대값이 작은 순으로 출력하라. 라는 문제가 있다고 가정하자.

    정렬을 할 때, 두 수의 절대값을 비교해서 작은 순으로 정렬하면 되는 문제이다. 


    정렬함수인 sort는 내부에서 '<' 연산자를 이용해서 비교한다. 

    그래서 연산자 오버로딩을 통해 우리가 원하는 작업을 추가하면 된다.

    아래 11번째 줄에 '<' 연산자를 오버로딩함으로써 두 객체의 절대값을 비교한다.

    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
    36
    37
    38
    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
     
    int abs(int x){return x < 0 ? -x : x;}
    struct info {
        int x, y;
        info(int _x, int _y) : x(_x), y(_y) {}
     
        bool operator< (const info& rhs){
            // 두 값의 차이의 절대값 = abs(x-y)
            // 두 개를 비교하여 작으면  참을 리턴한다
            // 만약 아래 부등호를 > 으로 바꾸면 오름차순으로 정렬된다.
            return abs(x-y) < abs(rhs.x - rhs.y);
            // 아래 코드는 위와 동일한 문장이다 
            // if(abs(x-y) < abs(rhs.x - rhs.y)) return true;
            // else return false;
        }
    };
     
    int main(){
        vector<info> v;
     
        v.push_back(info(12));
        v.push_back(info(35));
        v.push_back(info(15));
        v.push_back(info(1002));
        v.push_back(info(102));
        v.push_back(info(302));
     
     
        sort(v.begin(), v.end());
     
        for(info i : v){
            cout << i.x << " " << i.y << " diff : " << abs(i.x - i.y) << endl;
        }
    }
    cs

    결과는 아래와 같다




    ㅇㅇ
    ㅇㅁㄴㅇㅁㄴㅁㅁ





    댓글

Designed by Tistory.