파이썬에서도 연산자에 대하여 오버로딩을 지원합니다.
연산자 오버로딩이란 클래스가 +, - 등등의 특수한 연산자에 대하여 해당 연산자를 지원하도록 하는 것입니다.
Example1 |
1 + 2 = 3
[1,2,3] + [3,4,5]
|
파이썬에서 새로운 클래스에 대하여 + 연산자를 지원하기 위해서는 __add__ 라는 method 를 오버로딩하면 됩니다.
__add__ 는 Special Method라고 불립니다.
기존 메소드(함수)는 메소드를 호출해야만 작동하는 방식인 것에 반해서
Special method는 사용자의 편의를 위해서 파이썬에서 미리 정해진 메소드는 입니다.
What is Special Method?
클래스를 만들고 객체를 생성한다면 초기화를 해주기 위한 함수를 작성할 필요가 있습니다.
예를 들어 Vector라는 클래스가 있다면 백터의 크기에 대해서 초기화를 해주고 싶을 겁니다.
초기화 함수를 작성해서 객체를 만들고 함수를 사용자가 호출해야 할 겁니다.
1
2
3
4
5
6
7
8
9
10
11
|
Class Vector():
def initialize(self):
. . . 그 외
V = Vector()
V.initialize() <-- 매 순간마다 호출
|
만일 초기화를 해야 한다면 initialize 라는 함수를 작성해서 객체를 선언하고 initialize()를 호출한다.
[예시를 위한 코드로 이렇게 작성하시면 안됩니다!]
|
객체를 만들면 (거의) 모든 경우에 초기화를 해주기 때문에, 사용자가 일일이 메소드를 호출하는 것은
바람직하지 않습니다.
그래서 파이썬에서는 객체가 생성될 때, 자동으로 호출되는 특별한 메소드 __init__()이 있습니다.
1
2
3
4
5
6
7
|
이런 식으로 작성해주시면 됩니다.
|
이 처럼 Special method는 기존 메소드와 구분되기 위하여, 메소드 이름에 언더바가 추가된 형태입니다.
_ _ init _ _
_ _add_ _
_ _ mul _ _
Let's See the operator overloading
클래스 내에 언더바로 이루어진 메소드는 종류가 다양합니다.
a + b | a.__add__(b): |
a - b | a.__sub__(b): |
a * b | a.__mul__(b): |
a / b | a.__truediv__(b): |
a // b | a.__floordiv__(b): |
a % b | a.__and__(b): |
abs(a) | a.__abs__(): |
next(a) | a.__next__(): |
str(a) | a.__str__(): |
float(a) | a.__float__(): |
XXX(a) | a.__XXX(): 그 밖에 여러 special method가 있습니다. |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
class Vector():
def __init__(self, lst):
"""초기값을 lst의 값으로 합니다."""
self._container = lst
self._length = len(lst)
def __add__(self, w):
"""길이가 같을 때만 계산합니다"""
if self._length == w._length:
result = Vector([0]*self._length)
for i in range(self._length):
result._container[i] = self._container[i] + w._container[i]
return result
else:
raise ValueError("두 벡터의 길이가 다릅니다.")
def __str__(self):
return "<" + str(self._container)[1:-1] + ">"
v = Vector([2,2,2])
w = Vector([3,3,3])
R = v+w
print(str(R))
|
__init__ __add__ __str__ 세 가지 Special Method 를 구현한 Vector Class 입니다. |
'프로그래밍' 카테고리의 다른 글
[Python][Algorithm] Find Index Before Sorted (0) | 2020.01.27 |
---|---|
[Python][Algorithm] 조합 Combination (0) | 2020.01.26 |
[Python] Efficiency 1 - String Concatenatio (0) | 2020.01.20 |
Template C++ (함수) (0) | 2019.12.18 |
Graph 표현 방법 Adjacency Matrix (C 언어) (0) | 2019.06.15 |