Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python 기본 오버로딩 방법 완벽 가이드

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 코드를 훨씬 더 유연하고 직관적으로 작성할 수 있습니다.