33. Python에서의 캡슐화 – 연산자 중복 정의

안녕하세요. 언제나 휴일, 언휴예요.

이번에는 Python에서 연산자 중복 정의를 다룰거예요.

Python에서는 클래스를 정의할 때 일부 연산에 관한 메서드를 정의할 수 있어요. 이를 위해서는 이미 약속한 메서드 이름을 사용해야 합니다.

더하기는 __add__, 빼기는 __sub__, 곱하기는 __mul__, 나누기는 __div__, 플러스 기호는 __pos__, 마이너스 부호는 __neq__입니다. 이 외에도 __mod__(나머지), __and__(논리곱), __or__(논리합), __xor__(논리 상호 배제), __invert__(논리 부정), __abs__(절대값), __pow__(제곱), __floordiv__(//)입니다.

다음은 복소수 클래스를 정의한 예제 코드입니다. 여기에서는 부호 연산과 사칙 연산에 관하여 연산자 중복 정의를 구현하였습니다. 연산자 중복 정의에 관한 사항은 어떠한 이름으로 정의해야 하는지 말고는 특별한 사항이 없어요.

#연산자 중복 정의

class Complex:
    def __init__(self,real=0,image=0):
        self.__real = real
        self.__image = image

    def __add__(self,other):
        real = self.__real+other.__real
        image = self.__image+other.__image
        return Complex(real,image)

    def __sub__(self, other):
        real = self.__real-other.__real
        image = self.__image-other.__image
        return Complex(real,image)

    def __mul__(self, other):
        real = (self.__real*other.__real)-(self.__image*other.__image)
        image = (self.__real*other.__image)+(self.__image*other.__real)
        return Complex(real,image)

    def __truediv__(self,other):
        real_u = (self.__real*other.__real)+(self.__image*other.__image)
        image_u = (self.__image*other.__real)-(self.__real*other.__image)
        d_val = (other.__real*other.__real)+(other.__image*other.__image)
        real = real_u/d_val
        image = image_u/d_val
        return Complex(real,image)

    def __pos__(self):
        return self

    def __neg__(self):
        return Complex(-self.__real, -self.__image)

    def __str__(self):
        if(self.__image>=0):
            return str(self.__real)+"+"+str(self.__image)+"i"
        else:
            return str(self.__real)+str(self.__image)+"i"

n1 = Complex(2,3)
n2 = Complex(3,4)
print("n1:",n1)
print("n2:",n2)
print("+n1:",n1)
print("-n1:",-n1)
print("n1+n2:",n1+n2)
print("n1-n2:",n1-n2)
print("n1*n2:",n1*n2)
print("n1/n2:",n1/n2)
[그림 1] 연산자 중복 정의 예제 실행 화면
[그림 1] 연산자 중복 정의 예제 실행 화면