오버로딩
- 같은 이름의 메소드를 중복하여 정의하는 것
- 매개변수의 개수나 타입을 다르게 하면, 하나의 이름으로 메소드를 작성
- 객체 지향 프로그래밍의 특징 중 하나인 다형성(polymorphism)을 구현하는 방법 중 하나
파이썬의 오버로딩
- 파이썬은 타입이 동적으로 변하는 동적타입언어이기 때문에 오버로딩이 불가능하다.
- 오버로딩을 비슷하게 구현하기 위해 라이브러리를 활용한다.
불가능 예시
- 가장 아랫단의 코드로 자동으로 오버라이딩 된다.
class Siri:
def over(self, x):
print(x)
def over(self):
print("test1")
siri = Siri()
siri.over()
siri.over(10)
test1
TypeError: Siri.over() takes 1 positional argument but 2 were given
자료형에 따른 분기처리
- 인자의 자료형에 따라 분기처를 통해 로직을 구성한다.
- args,kwargs를 통해 모든 인자를 받아주고 후처리를 진행한다.
- args는 튜플,kwargs는 dict형태로 저장된다.
class Siri:
def over(self, *args, **kwargs):
if len(args) == 0:
print("over test")
elif type(args[0]) is int:
if kwargs["mode"] == "sum":
print(sum(args))
elif type(args[0]) is str:
if kwargs["mode"] == "sum":
print(args[0] + "+" + args[1])
print("test1")
siri = Siri()
print("==============1==================")
siri.over()
print("==============2==================")
siri.over("10", "20", mode="sum")
print("==============3==================")
siri.over(10, 20, mode="sum")
==============1==================
over test
test1
==============2==================
10+20
test1
==============3==================
30
test1
MultipleDispatch
- 자료형을 인자로 넣어준 dispatch 데코레이터를 활용한다.
class Siri:
@dispatch(int)
def over(self, x):
print(x)
@dispatch(int, int)
def over(self, x, y):
print(x * y)
siri = Siri()
print("==============1==================")
siri.over(10)
print("==============2==================")
siri.over(10, 20)
==============1==================
10
==============2==================
200