본문 바로가기
CS

[Python] 연산자 오버로딩

by 왕밤빵도라에몽 2025. 4. 19.
728x90

연산자 오버로딩 기본 지식

연산자 오버로딩은 사용자 정의 객체가 중위 연산자(ex. +, |)나 단항 연산자(ex. -, ~)를 사용할 수 있게 해줌
하지만 남용되기 쉬어 파이썬에서는 아래 제한을 두어 융통성, 사용성, 안전성을 유지함

  • 내장형의 연산자는 오버로드 할 수 없다
  • 새로운 연산자를 만들 수 없으며, 기존 연산자를 오버로드할 수만 있다.
  • is, and, or, not 연산자는 오버로드할 수 없다. (그러나 &, |, ~ 비트 연산자는 오버로드할 수 있다.)

단항 연산자

  • __neg__()가 구현하는 -
  • __pos__()가 구현하는 +
  • __invert__()가 구현하는 ~

+ 연산자 오버로딩 __add__(self, other)

벡터 덧셈을 정의

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __add__(self, other):
        return Vector(self.x + other.x, self.y + other.y)

    def __repr__(self):
        return f"Vector({self.x}, {self.y})"

v1 = Vector(1, 2)
v2 = Vector(3, 4)
print(v1 + v2)  # Vector(4, 6)

* 연산자 오버로딩 __mul__(self, scalar)

스칼라 곱 정의 (벡터 * 숫자)

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __mul__(self, scalar):
        return Vector(self.x * scalar, self.y * scalar)

    def __repr__(self):
        return f"Vector({self.x}, {self.y})"

v = Vector(2, 3)
print(v * 5)  # Vector(10, 15)

@연산자 오버로딩 __matmul__(self, other)

벡터의 내적 또는 행렬곱 표현

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __matmul__(self, other):
        return self.x * other.x + self.y * other.y  # 내적

v1 = Vector(1, 2)
v2 = Vector(3, 4)
print(v1 @ v2)  # 1*3 + 2*4 = 11

References

-『 전문가를 위한 파이썬(2판) 』, 루시아누 하말류, 한빛미디어, Part 1 - Chapter 16


  • 이외 비교 연산자, 복합 할당 연산자는 나중에 필요할 때 찾아보자.
728x90