파이썬에서는 하나의 메서드를 여러 가지 방식으로 호출할 수 있도록 정의할 수 있습니다. 함수 정의에 따라 매개변수 없이 호출하거나, 하나, 두 개 또는 그 이상의 매개변수와 함께 호출할 수 있습니다. 이처럼 같은 이름의 메서드를 다양한 형태로 호출하는 기법을 메서드 오버로딩(Method Overloading)이라고 합니다.
다만 자바나 C++와 달리 파이썬은 전통적인 의미의 오버로딩 문법을 지원하지 않습니다. 대신 기본 매개변수(default parameter)를 활용하면 동일한 효과를 얻을 수 있습니다.
아래 예제에는 sayHello() 메서드 하나만 가진 클래스가 있습니다. 이 메서드의 매개변수 name에 기본값 None을 설정하면, 인자를 넘기지 않고 호출하거나 인자를 넘겨서 호출하는 두 가지 방식 모두 사용할 수 있습니다.
클래스를 기반으로 객체를 생성한 뒤, 메서드 오버로딩을 구현하기 위해 sayHello()를 두 가지 방식으로 호출해 보겠습니다.
obj.sayHello()— 인자 없이 호출obj.sayHello('Rambo')— 인자를 하나 넘겨서 호출
이렇게 하면 정의 시 허용된 개수보다 적은 인자로 메서드를 호출할 수 있습니다. 선택적 매개변수는 두 개로 제한되지 않으므로, 필요하다면 더 많은 옵션 매개변수를 추가할 수도 있습니다.
예제 코드
class Human:
def sayHello(self, name=None):
if name is not None:
print('Hello ' + name)
else:
print('Hello')
obj = Human()
obj.sayHello()
obj.sayHello('Rambo')
실행 결과
Hello
Hello Rambo
추가 팁: 더 유연한 오버로딩 기법
기본 매개변수 외에도 다음과 같은 방법으로 오버로딩 효과를 낼 수 있습니다.
- *args, **kwargs: 가변 인자를 받아 호출 시 전달된 인자의 개수와 타입에 따라 분기 처리할 수 있습니다.
- functools.singledispatch: 첫 번째 인자의 타입에 따라 서로 다른 구현체가 실행되도록 등록할 수 있어, 타입 기반 오버로딩을 구현할 때 유용합니다.
이러한 기법들을 조합하면 파이썬에서도 자바·C++ 스타일의 오버로딩과 거의 동일한 동작을 구현할 수 있습니다.