Python 기초

특수 메소드

파이썬에서는 연산자(+, -, *, /)에 관련된 특수 메소드(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)는 (a, b)와 같이 2개의 실수로 표현될 수 있습니다. 벡터 간의 덧셈이나 뺄셈이 정의됩니다.

(a, b) + (c, d) = (a + c, b + d)

(a, b) - (c, d) = (a - c, b - d)

 

특수 메서드를 이용하여 + 연산과 - 연산을 구현하여 봅시다.

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