Minwoo Dev.

[C++] 연산자 오버로딩에서의 교환법칙 본문

C++

[C++] 연산자 오버로딩에서의 교환법칙

itisminu 2024. 7. 19. 12:58
728x90
반응형
SMALL

수학에서 교환법칙은 아래 식을 의미한다.

a + b = b + a

 

순서가 바뀌어도 연산의 결과는 동일하다는 말이다.

 

 

연산자 오버로딩에서는 이러한 교환법칙이 가능하지 않다.

예를 들어 멤버함수로의 + 연산자 오버로딩에서,

pos1 + pos2;

 

위 코드는 아래처럼 변환된다.

 

pos1.operator+(pos2);

 

 

하지만, 둘의 순서가 바뀐다면,

pos2 + pos1;

 

결과는 달라지게 된다.

pos2.operator(pos1);

 

 

위와 같이, 연산자 오버로딩에서는 기본적으로 교환법칙이 성립하지 않는다.

 

하지만 몇 줄의 코드로 교환법칙이 성립하게끔 바꿀 수 있다.

그에 대해서 설명하겠다.

 


 

연산자 오버로딩에서 교환법칙을 가능하게 만드는 방법

  • 전역함수 혹은 멤버함수로 하나 더 구현!
#include<iostream>
using namespace std;

class Point{
private:
    int xpos, ypos;
public:
    Point(int x = 0, int y = 0):xpos(x),ypos(y){}
    void ShowPosition() const{
        cout << '[' << xpos << ", " << ypos << ']' << endl;
    }
    Point operator*(int value){
        xpos *= value;
        ypos *= value;
        return *this;
    }
};


int main(void){
    Point pos1(3, 4);
    Point pos2 = pos1*6;
    pos2.ShowPosition();
    Point pos3 = 3 * pos1; // 에러 발생!!
    pos3.ShowPosition();
    return 0;
}

 

 

위 코드에서는 멤버 변수로 * 연산자 오버로딩을 수행하고 있다.

곱할 값이 뒤에 오는 경우에는 문제없이 실행되지만, 곱할 값이 앞에 오는 경우에는 에러가 발생한다.

 

pos1 * 6;

 

그 이유는 위 코드가

pos1.operator*(6);

 

으로 바뀌어서 실행되기 때문이다.

 

반면에 

3 * pos1;

위 코드는

3.operator*(pos1); // 3에는 operator* 존재하지 않음

 

위와 같은 형태가 되어버려서 에러가 발생하게 되는 것이다.

 

따라서 이를 보완하기 위해 전역함수로 또 하나의 오버로딩 함수를 구현해준다.

#include<iostream>
using namespace std;

class Point{
private:
    int xpos, ypos;
public:
    Point(int x = 0, int y = 0):xpos(x),ypos(y){}
    void ShowPosition() const{
        cout << '[' << xpos << ", " << ypos << ']' << endl;
    }
    Point operator*(int value){
        xpos *= value;
        ypos *= value;
        return *this;
    }
    friend Point operator*(int value, Point &p);
};

Point operator*(int  value , Point & p){ // 순서만 바꾸어주는 함수
    return p * value;
}

int main(void){
    Point pos1(3, 4);
    Point pos2 = pos1*6;
    pos2.ShowPosition();
    Point pos3 = 3 * pos1;
    pos3.ShowPosition();
    return 0;
}

 

실행 결과

 

 

 

위 코드에서 전역 함수로 선언된 부분을 자세히 보자.

 

Point operator*(int  value , Point & p){
    return p * value;
}

 

매개변수의 순서가 int value, Point &p인 것을 확인할 수 있다.

따라서, 정수형 값이 앞에 먼저 온 경우에는 이 오버로딩 함수를 호출하게 된다!

 

함수 내부에 모두 구현해도 되지만, 가볍게 순서만 바꾸어 멤버함수로 존재하는 오버로딩 함수를 호출하는 방식으로 작성하였다.

 

 

 

 

이렇듯 오버로딩 함수의 교환법칙은 멤버 함수가 존재한다면 전역 함수로, 전역 함수가 존재한다면 멤버 함수로 하나를 작성해 순서만 바꿔주는 식으로 간단히 나타내어 해결할 수 있다!

728x90
반응형
LIST