C++은 할건데, C랑 다른 것만 합니다. 6편 연산자 오버로딩 1, 대입 연산자, 산술 연산자, 비교 연산자

0

C++

목록 보기
6/10

연산자 오버로딩1, 대입 연산자, 산술 연산자, 비교 연산자

https://modoocode.com/202

연산자 오버로딩은 기존에 있는 연산자들(+, - , % , / , >= , == , += , -=, ++, -- , [] 등등)을 오버로딩하여 구현하는 것으로 해당 연산자에 자신이 원하는 로직을 구현할 수 있다.

주의할 것이 연산자 오버로딩이다. 오버라이딩이 아니다.

이를 알아두면 좋은 이유는 만약 기존의 코드에서 비교 연산자나 +, - 연산자 등이 사용되었다면, 굳이 내가 만든 함수로 바꾸지 않고 타입만 바꿈으로서 기존 코드를 고치치 않고 코드 변경이 가능하기 때문이다.

일반적으로 연산자 오버로딩을 사용하기 위해서는 다음과 같은 연산자 함수를 만들면 된다.

(리턴 타입) operator(연산자)(인자){}

함수 이름은 반드시 operator이며 연산자와 붙여써야 한다. 즉, +연산자를 오버로딩하고 싶다면 , operator+로 써야한다.

1. == 연산자 오버로딩

`== 연산자 오버로딩은 반환형이 bool이여야 한다. 참고로, 연산자 오버로딩의 반환형은 원하는대로 해줄 수 있다. 굳이 bool이 아니라 double이어도 상관없지만, bool로 해주는 것이 기본이니 해주도록 하자.

다음과 같이 생겼다.

bool operator==(Object obj);

이제 우리가 object1 == object2를 실행하면, 이는 object.operator==(object2)로 내부적으로 처리된다.

#include <iostream>

using namespace std;

class Object{
    private:
        int value;
    public:
        Object(int _value) : value(_value) {};
        bool operator==(Object& obj);
};

bool Object::operator==(Object& obj){
    return value == obj.value;
}

int main(){
    Object obj1(10);
    Object obj2(14);
    cout << (obj1 == obj2) << endl;
}
0

이제 다음과 같이 obj == obj로 비교연산자를 사용할 수 있다.

2. + ,- , *, /, % operator 오버로딩

x, y 값을 갖는 Point가 있다고 하자

#include <iostream>

using namespace std;

class Point{
    private:
        int x;
        int y;
    public:
        Point(int _x, int _y);
};

Point::Point(int _x, int _y) : x(_x), y(_y) {}


int main(){
    Point point1(1,10);
    Point point2(3,5);
}

이들을 + 연산자로 더해주고 싶다. 먼저 더하기 전에 대입 연산자를 오버로딩해주도록 하자, 대입 연산자가 오버로딩 안되어있으면 결과를 저장할 곳이 없기 때문이다.

Point operator=(const Point& point)

다음과 같이 자기 자신을 리턴하는 operator를 만들어주면 된다.

연산을 더 빠르게 하기위해서 참조자를 반환해도 된다.

Point& operator=(const Point& point)

그러나, 이렇게 쓰면 헷갈릴 것 같으므로, Point 반환형으로 쓰도록 하자

#include <iostream>

using namespace std;

class Point{
    private:
        int x;
        int y;
    public:
        Point(int _x, int _y);
        Point operator=(const Point& point);
        void printXY();
};

Point::Point(int _x, int _y) : x(_x), y(_y) {}
Point Point::operator=(const Point& point){
    x = point.x;
    y = point.y;
    return *this;
}
void Point::printXY(){
    cout << "point x : " << x << " y : " << y << endl;
}

int main(){
    Point point1(1,10);
    Point point2(3,5);
    point1 = point2;
    point1.printXY();
}
point x : 3 y : 5

이제 +, - , *, %, / 연산자를 만들어보자, return 타입은 Point가 될 것이다.

#include <iostream>

using namespace std;

class Point{
    private:
        int x;
        int y;
    public:
        Point(int _x, int _y);
        Point operator=(const Point& point);
        Point operator+(const Point& point);
        Point operator-(const Point& point);
        Point operator*(const Point& point);
        Point operator/(const Point& point);
        Point operator%(const Point& point);
        void printXY();
};

Point::Point(int _x, int _y) : x(_x), y(_y) {}
Point Point::operator=(const Point& point){
    x = point.x;
    y = point.y;
    return *this;
}
Point Point::operator+(const Point& point){
    x += point.x;
    y += point.y;
    return *this;
}
Point Point::operator-(const Point& point){
    x -= point.x;
    y -= point.y;
    return *this;
}
Point Point::operator*(const Point& point){
    x *= point.x;
    y *= point.y;
    return *this;
}
Point Point::operator/(const Point& point){
    x /= point.x;
    y /= point.y;
    return *this;
}
Point Point::operator%(const Point& point){
    x %= point.x;
    y %= point.y;
    return *this;
}
void Point::printXY(){
    cout << "point x : " << x << " y : " << y << endl;
}

int main(){
    Point point1(1,10);
    Point point2(3,5);
    
    point1 = point1 + point2;
    point1.printXY();

    point1 = point1 - point2;
    point1.printXY();

    point1 = point1 * point2;
    point1.printXY();

    point1 = point1 / point2;
    point1.printXY();

    point1 = point2 % point1;
    point1.printXY();
}
point x : 4 y : 15
point x : 1 y : 10
point x : 3 y : 50
point x : 1 y : 10
point x : 0 y : 5

원하는 대로 잘 나온 것을 확인할 수 있다.

3. < , > , >= , <= 비교 연산자 오버로딩

이번에는 비교연산자 오버로딩을 해보도록 하자

이는 꽤나 많이 하는 오버로딩인데, 구조체나 클래스에 비교 연산자 오버로딩을 하고 정렬 알고리즘을 돌리면 아주 쉽게 정렬이된다.

타입이 바뀌었다고해서 정렬 알고리즘에 compare 함수들을 추가할 것이 아니라, 비교 연산자 오버로딩만 해주면 되기 때문이다.

그럼 위의 예제에서 Point들을 비교할 때, x가 크면 true, x가 같으면 y가 큰 것을 true로 하도록 하자,

즉, (1,3) < (3,4) 이 true이고, (1,3) > (1,2)이 true로 만드는 것이다.

따라서, 비교연산자는 반환값이 bool이다.

bool operator<(const Point& point)

다음처럼 만들어보자

class Point{
    private:
        int x;
        int y;
    public:
        Point(int _x, int _y);
        Point operator=(const Point& point);
        Point operator+(const Point& point);
        Point operator-(const Point& point);
        Point operator*(const Point& point);
        Point operator/(const Point& point);
        Point operator%(const Point& point);
        bool operator<(const Point& point);
        bool operator<=(const Point& point);
        bool operator>(const Point& point);
        bool operator>=(const Point& point);
        void printXY();
};

다음과 같이 선언부를 작성하고,

bool Point::operator<(const Point& point){
    if(x == point.x){
        return y < point.y;
    }
    return x < point.x;
}
bool Point::operator<=(const Point& point){
    if(x == point.x){
        return y <= point.y;
    }
    return x < point.x;
}
bool Point::operator>(const Point& point){
    if(x == point.x){
        return y > point.y;
    }
    return x > point.x;
}
bool Point::operator>=(const Point& point){
    if(x == point.x){
        return y >= point.y;
    }
    return x > point.x;
}

구현부를 다음과 같이 적어주면 된다.

int main(){
    Point point1(1,10);
    Point point2(2,5);
    Point point3(1,12);
    Point point4(1,5);
    Point point5(1,10);
    
    if( point1 < point2){
        cout <<"point2 is greater than point1" << endl;
    }else{
        cout <<"point1 is greater than point1" << endl;
    }
    cout << "-----------------------------" << endl;
    if( point1 < point3){
        cout <<"point3 is greater than point1" << endl;
    }else{
        cout <<"point1 is greater than point1" << endl;
    }
    cout << "-----------------------------" << endl;
    if( point1 < point4){
        cout <<"point4 is greater than point1" << endl;
    }else{
        cout <<"point1 is greater than point1" << endl;
    }
    cout << "-----------------------------" << endl;
    if(point1 <= point5){
        cout << "point5 is equal and greater than point1" << endl;
    }
}

다음의 경우를 구동시켜보면 결과가 나온다.

point2 is greater than point1
-----------------------------
point3 is greater than point1
-----------------------------
point1 is greater than point1
-----------------------------
point5 is equal and greater than point1

0개의 댓글