728x90

매직 메서드란?

매직 메서드는 파이썬의 특수한 메서드로, 던더(double underscore, __)로 시작하고 끝나는 이름을 가지고 있음

특정한 문법이나 동작을 제공하거나 클래스의 특정한 동작을 변경하거나 확장하는 데 사용됨

매직메서드의 종류

일반적으로 사용되는 매직 메서드

  • __init__
    • 이 메서드는 클래스의 인스턴스가 생성될 때 호출되는 초기화 메서드로, 주로 객체의 속성을 초기화하고 초기 상태를 설정하는 데 사용
  • __repr__ 및 __str__
    • 객체의 문자열 표현을 반환
    • __repr__: 객체의 "official" 문자열 표현을 반환하는 메서드로, 객체를 재생성할 수 있는 문자열을 반환 (개발자용으로 사용됨)
    • __str__: 객체의 "informal" 문자열 표현을 반환하는 메서드로, 사용자에게 보여주기 위한 문자열을 반환
  • __len__
    • 객체의 길이를 반환 len() 함수가 호출될 때 사용됨
    • 리스트, 튜플, 문자열 등과 같은 내장된 시퀀스 형식들은 모두 __len__ 메서드를 구현하여 길이 반환 가능
  • __getitem__ 및 __setitem__
    • 이 두 메서드는 객체의 인덱싱 및 슬라이싱을 지원
    • __getitem__: 인덱싱 및 슬라이싱을 통해 요소를 가져오는 메서드
    • __setitem__: 인덱싱을 통해 요소에 값을 할당하는 메서드
  • __iter__ 및 __next__
    • 두 메서드는 객체의 이터레이션을 지원
    • __iter__: 이터레이터를 반환하는 메서드로, 이터레이터 프로토콜을 지원하여 객체를 반복할 수 있게 함
    • __next__: 다음 값을 반환하는 메서드로, 이터레이터의 다음 요소를 반환

연산자 오버로딩을 위한 매직 메서드

  • __add__(self, other)
    • 덧셈 연산자(+)를 오버로딩
    • 객체와 다른 객체를 더한 결과를 반환
  • __sub__(self, other)
    • 뺄셈 연산자(-)를 오버로딩
    • 객체에서 다른 객체를 뺀 결과를 반환
  • __mul__(self, other)
    • 곱셈 연산자(*)를 오버로딩
    • 객체와 다른 객체를 곱한 결과를 반환
  • __truediv__(self, other)
    • 나눗셈 연산자(/)를 오버로딩
    • 객체를 다른 객체로 나눈 결과를 반환
  • __floordiv__(self, other)
    • 나눗셈 연산자의 몫(//)를 오버로딩
    • 객체를 다른 객체로 나눈 몫을 반환
  • __mod__(self, other)
    • 나머지 연산자(%)를 오버로딩
    • 객체를 다른 객체로 나눈 나머지를 반환
  • __pow__(self, other[, modulo])
    • 거듭제곱 연산자(**)를 오버로딩
    • 객체를 다른 객체의 거듭제곱으로 계산한 결과를 반환
  • __eq__(self, other)
    • 동등성 비교 연산자(==)를 오버로딩
    • 객체가 다른 객체와 동일한지를 확인하는 데 사용
  • __lt__(self, other), __gt__(self, other), __le__(self, other), __ge__(self, other)
    • 대소 비교 연산자(<, >, <=, >=)를 오버로딩
    • 객체를 다른 객체와 비교하여 대소 관계를 확인하는 데 사용

컨텍스트 관리를 위한 매직 메서드

  • __enter__(self)
    • 컨텍스트가 시작될 때 호출되는 메서드
    • 이 메서드는 with 블록의 시작에서 호출되며, 컨텍스트 진입 시 수행해야 하는 작업을 정의
    • 일반적으로 컨텍스트 진입 시 초기화 작업이나 리소스를 할당하는 작업을 수행
    • 이 메서드는 with 문에 의해 생성된 컨텍스트 매니저를 반환
  • __exit__(self, exc_type, exc_value, traceback)
    • 컨텍스트가 종료될 때 호출되는 메서드
    • 이 메서드는 with 블록에서 예외가 발생했더라도 항상 호출
    • 컨텍스트 종료 시 정리 작업을 수행하거나 예외 처리를 위한 로직을 구현 가능
    • 만약 예외가 발생했을 경우에는 exc_type, exc_value, traceback 파라미터에 예외 정보가 전달됨

매직 메서드를 사용한 커스텀 데이터 구조 및 동작 정의 예시

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 __sub__(self, other):
        return Vector(self.x - other.x, self.y - other.y)

    # 벡터의 스칼라 곱셈 연산을 정의
    def __mul__(self, scalar):
        return Vector(self.x * scalar, self.y * scalar)

    # 벡터의 크기(길이)를 반환하는 메서드를 정의
    def __abs__(self):
        return (self.x ** 2 + self.y ** 2) ** 0.5

    # 벡터의 문자열 표현을 정의
    def __str__(self):
        return f"({self.x}, {self.y})"

# 사용 예시
v1 = Vector(1, 2)
v2 = Vector(3, 4)

print("v1 =", v1)
print("v2 =", v2)
print("v1 + v2 =", v1 + v2)  # 벡터 덧셈
print("v1 - v2 =", v1 - v2)  # 벡터 뺄셈
print("v1 * 2 =", v1 * 2)    # 스칼라 곱셈
print("|v1| =", abs(v1))     # 벡터 크기(길이)

참고

매직메서드소개 : https://wikidocs.net/83755

728x90

+ Recent posts