3. 이름은 하나, 행동은 여러 개: 여러 함수로 분기하기

C 언어나 Java 같은 언어에서는 함수 이름이 같더라도, 집어넣는 재료(매개변수)의 개수나 데이터 타입이 다르면 알아서 상황에 맞는 함수가 착착 실행됩니다. 이를 함수 오버로딩(Overloading) 이라고 부릅니다.

하지만 파이썬은 변수의 ‘자료형’을 미리 정해놓지 않기 때문에, 똑같은 이름으로 함수를 여러 개 만들면 가장 마지막에 쓴 함수가 앞에 쓴 함수들을 그대로 덮어씌워버려서 기존 기능이 날아가 버립니다.

이럴 때 파이썬의 외부 마법 도구(외부 모듈)인 multipledispatch를 사용하면, 파이썬에서도 우아하게 “알아서 재료에 맞는 함수를 고르는 기계”를 만들 수 있습니다.


3.1 multipledispatch 모듈로 마법 부리기

이 도구는 기본 내장 도구가 아니므로, 만약 설치되어 있지 않다면 터미널에서 설치해야 합니다. (pip install multipledispatch)

이 모듈의 dispatch 데코레이터를 이용하면, 같은 함수 이름(add)을 쓰더라도 괄호 안에 들어올 데이터 타입(시그니처)을 데코레이터에 명시해주어 알아서 갈림길을 나눠줄 수 있습니다.

from multipledispatch import dispatch

# 1번 기계: 정수(int) 두 개가 들어올 때는 여기서 덧셈을 합니다!
@dispatch(int, int)
def add(x, y):
    print("▶ 정수 계산기를 돌립니다.")
    return x + y

# 2번 기계: 문자열(str) 두 개가 들어올 때는 글자를 이어 붙입니다!
@dispatch(str, str)
def add(x, y):
    print("▶ 문자열 이어붙이기를 돌립니다.")
    return x + y

# 3번 기계: 리스트(list) 두 개가 들어올 때는 리스트를 합칩니다!
@dispatch(list, list)
def add(x, y):
    print("▶ 리스트 병합을 돌립니다.")
    return x + y

마법의 결과 확인하기

함수 이름은 무조건 add 하나만 호출하지만, 파이썬이 던져준 재료들을 킁킁 냄새 맡고(자료형 확인) 알아맞혀서, 자기가 가야 할 기계로 배송해줍니다.

결과가 덮어씌워지지 않고, 각각 고유한 로직이 실행됩니다. 이를 멀티플 디스패치(Multiple Dispatch)라고 부릅니다.

# 1번 기계로 배송됨
print(add(5, 10)) 
# ▶ 정수 계산기를 돌립니다.
# 15

# 2번 기계로 배송됨
print(add("Hello ", "World"))
# ▶ 문자열 이어붙이기를 돌립니다.
# "Hello World"

# 3번 기계로 배송됨
print(add([1, 2], [3, 4]))
# ▶ 리스트 병합을 돌립니다.
# [1, 2, 3, 4]

비록 파이썬은 동적 타이핑이라 오버로딩을 기본적으로 권장하지 않고 하나의 함수 안에서 isinstance 등으로 분기 처리를 하도록 안내하지만, 분기할 조건이 너무 복잡하거나 모듈 단위로 행동을 깔끔하게 나눠야 하는 강력한 구조 설계가 필요할 때 훌륭한 대안이 됩니다.

서브목차