메서드 오버로딩이란 무엇인가?
메서드 오버로딩(method overloading)이란 같은 이름의 메서드를 여러 개 정의하고, 전달되는 인자의 개수나 타입에 따라 서로 다른 동작을 수행하도록 만드는 기법입니다. Java나 C++처럼 타입을 명시적으로 선언하는 정적 타이핑 언어에서 자주 볼 수 있는 기능입니다.
Python에서는 메서드 오버로딩이 불가능합니다
결론부터 말씀드리면, Python에서는 메서드 오버로딩을 사용할 수 없습니다. Python에서는 같은 이름의 메서드를 클래스 안에 두 번 정의하면, 나중에 정의한 메서드가 앞선 메서드를 완전히 덮어써 버리기 때문입니다.
class Example:
def greet(self):
print("안녕하세요")
def greet(self, name):
print(f"안녕하세요, {name}님")
obj = Example()
obj.greet() # TypeError 발생!위 코드에서 두 번째 greet 메서드가 첫 번째 메서드를 대체해 버리므로, 인자 없이 호출하면 TypeError가 발생합니다. 즉, Python에서는 굳이 같은 이름의 메서드를 여러 개 둘 필요도 없고, 그렇게 할 수도 없습니다.
그렇다면 어떻게 대체할 수 있을까?
1. 기본 인자(Default Argument) 활용
인자에 기본값을 지정하면 하나의 메서드로 다양한 호출 형태를 처리할 수 있습니다.
class Greeter:
def greet(self, name="손님"):
print(f"안녕하세요, {name}님")
g = Greeter()
g.greet() # 안녕하세요, 손님
g.greet("민수") # 안녕하세요, 민수2. 가변 인자(*args, **kwargs) 활용
인자의 개수가 정해지지 않은 경우에는 가변 인자를 사용해 유연하게 처리할 수 있습니다.
def add(*args):
return sum(args)
print(add(1, 2)) # 3
print(add(1, 2, 3, 4)) # 103. 메서드 오버라이딩(Method Overriding) 활용
만약 동일한 기능을 상황에 따라 다르게 동작시키고 싶다면, 오버로딩보다는 상속과 함께 메서드 오버라이딩을 사용하는 것이 바람직합니다. 부모 클래스의 메서드를 자식 클래스에서 재정의하면, 각 클래스의 특성에 맞는 동작을 구현할 수 있습니다.
class Animal:
def speak(self):
print("동물이 소리를 냅니다")
class Dog(Animal):
def speak(self):
print("멍멍!")
Dog().speak() # 멍멍!정리
Python은 문법적으로 메서드 오버로딩을 지원하지 않지만, 기본 인자, 가변 인자, 메서드 오버라이딩 등의 기법을 활용하면 오버로딩과 유사한 효과를 충분히 얻을 수 있습니다. Python의 동적 타이핑 특성상 하나의 유연한 메서드로 다양한 입력을 처리하는 것이 더 파이썬다운(Pythonic) 접근 방식이라는 점을 기억하세요.