Python 기초

연산자 오버로딩

우리는 문자열을 결합하기 위하여 + 연산자를 사용하고 2개의 문자열을 비교하기 위하여 == 연산자를 사용합니다.

이들 연산자들은 실제로 str 클래스 안에 정의된 메소드입니다. 연산자를 메소드로 정의하는 것을 연산자 오버로딩(operator overloading)이라고 합니다.

연산자 오버로딩을 이용하면 여러 가지 연산자들을 클래스들의 메소드로 연결할 수 있습니다.

 

예를 들어서 + 연산자에 대응되는 메소드는 __add(self, other)이고 == 연산자들에 대응되는 메소드는 __eq__(self, other)입니다.

문자열을 연결할 때 + 연산자 대신에 이들 메소드를 사용하여도 됩니다. (물론 일부러 그러시면 봉민이입니다. ^^ )

s1 = "Red "
s2 = "Velvet"
s3 = s1.__add__(s2)
print(s3)

 

<실행 결과>

Red Velvet

 

연산자 수식 예 내부적인 함수 호출
덧셈 x + y x.__add__(y)
뺄셈 x - y x.__sub__(y)
곱셈 x * y x.__mul__(y)
지수 x ** y x.__pow__(y)
나눗셈(실수) x / y x.__truediv__(y)
나눗셈(정수) x // y x.__floordiv__(y)
나머지 x % y x.__mod__(y)
비트 왼쪽 이동 x << y x.__lshift__(y)
비트 오른쪽 이동 x >> y x.__rshift__(y)
비트 AND x & y x.__and__(y)
비트 OR x | y x.__or__(y)
비트 XOR x ^ y x.__xor__(y)
비트 NOT ~x x.__invert__()

 

클래스에서 연산 정의하기

우리가 작성하는 클래스에서도 기본 연산자들을 우리 마음대로 재정의하여서 사용할 수 있습니다.

예를 들어서 2차원 공간에서 한 점을 클래스로 정의하였다고 가정할 때 점과 점을 + 연산으로 합할 수 있다면 편리할 것입니다.

class Point:
    def __init__(self, x = 0, y = 0):
        self.x = x
        self.y = y

p1 = Point(1, 2)
p2 = Point(3, 4)
print(p1 + p2)

 

<실행 결과>

TypeError: unsupported operand type(s) for +: 'Point' and 'Point'

 

기본적으로 Point 클래스 객체에 대해서는 + 연산이 정의되지 않습니다.

하지만 우리가 만약 다음과 같이 __add__(self, other)를 정의한다면 Point 클래스에 대해서도 + 연산자를 적용할 수 있습니다.

class Point:
    def __init__(self, x = 0, y = 0):
        self.x = x
        self.y = y

    def __add__(self, other):
        x = self.x + other.x
        y = self.y + other.y
        return Point(x, y)  # Point 객체 끼리의 + 연산을 정의합니다.

p1 = Point(1, 2)
p2 = Point(3, 4)
print(p1 + p2)

 

<실행 결과>

<__main__.Point object at 0x000002A42ADD4A90>

 

이번에는 오류가 발생하지 않았지만 print(p1 + p2)의 결과값이 객체의 주소가 출력됩니다.

이것도 아래와 같이 __str__()을 이용하여서 출력 형식을 변경할 수 있습니다.

class Point:
    def __init__(self, x = 0, y = 0):
        self.x = x
        self.y = y

    def __add__(self, other):
        x = self.x + other.x
        y = self.y + other.y
        return Point(x, y)  # Point 객체 끼리의 + 연산을 정의합니다.

    def __str__(self):
        return 'Point(' + str(self.x) + ', ' + str(self.y) + ')'

p1 = Point(1, 2)
p2 = Point(3, 4)
print(p1 + p2)

 

<실행 결과>

Point(4, 6)

 

도전 과제

책을 나타내는 Book 클래스를 작성하고 Book 클래스 내부에 __add__() 함수를 정의하여 Book 클래스의 객체들을 서로 합할 수 있게 합시다.

__add__()  함수는 책의 페이지들을 합쳐서 반환합니다.

 

Book 클래스는 다음과 같은 인스턴스 변수를 가집니다.

  • title : 책의 제목을 나타냅니다. (문자열)
  • pages : 책의 페이지를 나타냅니다. (정수형)

 

book1은 '자료구조'라는 책의 제목과 600 페이지를 가지며, book2는 'C언어'라는 책의 제목과 700 페이지를 가질 때 book1 + book2 의 계산 결과를 출력하세요.

 

<실행 결과>

1300