Python 클래스는 객체 지향 프로그래밍(OOP) 패러다임의 모든 표준 기능을 제공합니다. 그중에서도 오버로딩(Overloading)은 Python의 유연성을 보여주는 대표적인 기능으로, 크게 연산자 오버로딩과 메서드 오버로딩 두 가지로 나눌 수 있습니다.
1. Python 객체 지향 프로그래밍의 핵심 특징
Python의 클래스 상속 메커니즘은 여러 기반 클래스(다중 상속)를 허용합니다. 파생 클래스는 기반 클래스의 어떤 메서드든 자유롭게 재정의(오버라이딩)할 수 있으며, 메서드 내부에서는 super()를 사용해 같은 이름의 기반 클래스 메서드를 호출할 수도 있습니다.
class Parent:
def greet(self):
return "안녕하세요, 부모 클래스입니다."
class Child(Parent):
def greet(self): # 메서드 오버라이딩
parent_message = super().greet() # 기반 클래스 메서드 호출
return f"{parent_message} 저는 자식 클래스입니다."2. 연산자 오버로딩(Operator Overloading)
Python에서 오버로딩이라고 하면 일반적으로 연산자 오버로딩을 의미합니다. 이는 매직 메서드(던더 메서드)라고 불리는 특수 메서드를 클래스 안에 정의하는 방식으로 구현합니다. 대표적인 매직 메서드는 다음과 같습니다.
__init__: 객체 생성 시 초기화 담당__str__,__repr__: 객체를 문자열로 표현__add__,__sub__: 덧셈(+), 뺄셈(-) 연산자 동작 정의__eq__: 동등 비교(==) 연산자 동작 정의__len__:len()함수 호출 시 반환값 정의
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, other): # + 연산자 오버로딩
return Point(self.x + other.x, self.y + other.y)
def __str__(self):
return f"Point({self.x}, {self.y})"
p1 = Point(1, 2)
p2 = Point(3, 4)
print(p1 + p2) # 출력: Point(4, 6)이처럼 연산자 오버로딩을 활용하면 사용자 정의 객체에도 내장 타입처럼 자연스러운 연산을 적용할 수 있습니다.
3. 메서드 오버로딩(Method Overloading)
C++나 Java와 달리 Python은 전통적인 의미의 메서드 오버로딩을 직접 지원하지 않습니다. 같은 이름의 메서드를 여러 번 정의하면 마지막에 정의한 메서드만 유효하기 때문입니다. 대신 다음과 같은 방법으로 오버로딩 효과를 구현할 수 있습니다.
기본 인수(Default Arguments) 활용
class Calculator:
def add(self, a, b=0, c=0):
return a + b + c
calc = Calculator()
print(calc.add(1)) # 1
print(calc.add(1, 2)) # 3
print(calc.add(1, 2, 3)) # 6*args, **kwargs 활용
class Printer:
def show(self, *args):
for arg in args:
print(arg)
printer = Printer()
printer.show("A")
printer.show("A", "B", "C")functools.singledispatch 활용
인수의 타입에 따라 다른 동작이 필요하다면 표준 라이브러리의 functools.singledispatch 데코레이터를 사용하는 것이 좋습니다.
from functools import singledispatch
@singledispatch
def process(value):
return f"기본 처리: {value}"
@process.register(int)
def _(value):
return f"정수 처리: {value * 2}"
@process.register(str)
def _(value):
return f"문자열 처리: {value.upper()}"마무리
Python의 오버로딩은 매직 메서드를 통한 연산자 오버로딩이 중심이며, 메서드 오버로딩은 기본 인수·가변 인수·singledispatch 등으로 우아하게 대체됩니다. 다중 상속과 메서드 오버라이딩, super() 호출까지 함께 익혀두면 객체 지향 Python 코드를 훨씬 더 유연하고 직관적으로 작성할 수 있습니다.