파이썬/클래스와 객체 지향

파이썬에서 __add__와 연산자 재정의

Data Jun 2025. 9. 6. 16:45

파이썬은 객체지향 언어답게 +, -, * 같은 연산자도 직접 정의할 수 있습니다.
이때 사용하는 것이 바로 **매직 메서드(dunder method)**인데, 그중 대표적인 것이 __add__입니다.

 

1. + 연산자는 내부적으로 __add__ 호출

class Fruit:
    def __init__(self, name, price):
        self._name = name
        self._price = price

    def __add__(self, other):
        return self._price + other._price

s1 = Fruit('Orange', 7500)
s2 = Fruit('Banana', 3000)

print(s1 + s2)          # 10500
print(s1.__add__(s2))   # 10500 (동일한 동작)
  • s1 + s2 → 내부적으로 s1.__add__(s2) 실행
  • 만약 __add__가 정의되어 있지 않으면 TypeError 발생

 

2. 다른 클래스와도 연산 가능하다

s2가 꼭 같은 클래스일 필요는 없습니다.
__add__에서 필요한 속성(여기서는 _price)만 존재하면 동작합니다.

class Drink:
    def __init__(self, name, price):
        self._name = name
        self._price = price

s1 = Fruit('Orange', 7500)
s2 = Drink('Juice', 2500)

print(s1 + s2)   # 10000

 

이처럼 파이썬은 “타입이 같아야 한다”는 제약보다, “필요한 속성이 있으면 된다”는 덕 타이핑(duck typing) 철학을 따릅니다.

“만약 어떤 새가 오리처럼 걷고, 오리처럼 소리를 낸다면, 그건 오리다.”

 

 

3. 속성이 없으면 오류 발생

만약 other 객체에 _price 속성이 없다면 에러가 발생합니다.

class Toy:
    def __init__(self, name):
        self._name = name

t = Toy('Lego')
print(s1 + t)   # ❌ AttributeError: 'Toy' object has no attribute '_price'
 

 

정리하면

  • + 연산자는 내부적으로 __add__ 메서드를 호출한다.
  • 두 객체가 꼭 같은 클래스일 필요는 없다. 필요한 속성이 있으면 정상 동작한다.
  • 필요한 속성이 없다면 AttributeError가 발생한다.
  • 이것이 바로 파이썬의 덕 타이핑 철학: “모양과 행동이 맞으면 된다.”