파이썬에서는 연산자(+, -, *, /)에 관련된 특수 메소드(special method)가 있습니다. 이들 메소드는 우리가 객체에 대하여 +, -, *, / 와 같은 연산을 적용하면 자동으로 호출됩니다.
특수 메소드를 이용하면 객체의 상황에 맞는 자연스러운 연산을 정의할 수 있어서 편리할 때가 많습니다.
예를 들어서 원을 나타내는 클래스 Cricle에 대하여 다음과 같이 __eq__() 메소드를 정의하였다고 합시다.
class Circle:
...
def __eq__(self, other):
return self.radius == other.radius
__eq__() 메소드가 정의된 객체는 == 연산자를 이용하여 서로 비교할 수 있습니다.
c1 = Circle(10)
c2 = Circle(10)
if c1 == c2:
print("원의 반지름은 동일합니다.")
아래의 표에 특수 메소드들과 관련된 연산자들을 나열하였습니다.
| 연산자 | 메소드 | 설명 |
| x + y | __add__(self, y) | 덧셈 |
| x - y | __sub__(self, y) | 삘셈 |
| x * y | __mul__(self, y) | 곱셈 |
| x / y | __truediv__(self, y) | 실수 나눗셈 |
| x // y | __floordiv__(self, y) | 정수 나눗셈 |
| x % y | __mod(self, y) | 나머지 |
| divmode(x, y) | __divmod__(self, y) | 실수 나눗셈과 나머지 |
| x ** y | __pow__(self, y) | 지수 |
| x << y | __lshift__(self, y) | 왼쪽 비트 이동 |
| x >> y | __rshift__(self, y) | 오른쪽 비트 이동 |
| x <= y | __le__(self, y) | less than or equal (작거나 같다) |
| x < y | __lt__(self, y) |
less than (작다) |
| x >= y | __ge__(self, y) | greater than or equal (크거나 같다) |
| x > y | __gt__(self, y) | greater than (크다) |
| x == y | __eq__(self, y) | 같다 |
| x != y | __neq(self, y) | 같지 않다 |
2차원 공간에서 벡터(vector)는 와 같이 2개의 실수로 표현될 수 있습니다. 벡터 간의 덧셈이나 뺄셈이 정의됩니다.
특수 메서드를 이용하여 + 연산과 - 연산을 구현하여 봅시다.
class Vector2D:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, other):
return Vector2D(self.x + other.x, self.y + other.y) # 새로운 객체를 생성하여 반환합니다.
def __sub__(self, other):
return Vector2D(self.x - other.x, self.y - other.y)
def __eq__(self, other):
return self.x == other.x and self.y == other.y
def __str__(self):
return '(%g, %g)' % (self.x, self.y)
u = Vector2D(0, 1)
v = Vector2D(1, 0)
w = Vector2D(1, 1)
a = u + v # 여기서 __add__()가 호출됩니다.
print(a)
<실행 결과>
(1, 1)

연산 뿐만 아니라 len()과 같은 내장 함수도 특수 메소드로 우리가 정의할 수 있습니다.
예를 들어 책을 나타내는 클래스 Book을 만들고 len() 함수를 정의해봅시다. len() 함수는 책의 페이지를 반환하는 것으로 합니다.
class Book:
def __init__(self, title, author, pages):
self.title = title
self.author = author
self.pages = pages
def __str__(self):
return "제목 : %s, 저자 : %s, 페이지 : %s" % \
(self.title, self.author, self.pages)
def __len__(self):
return self.pages
book = Book("Data Structure", "봉민", 450)
print(book)
print(len(book))
<실행 결과>
제목 : Data Structure, 저자 : 봉민, 페이지 : 450
450
