본문 바로가기

개념

[파이썬] 매직 메소드란

파이썬 매직 메소드는 파이썬에서 객체 지향 프로그래밍을 구현하는 데 중요한 역할을 합니다. 이 메소드들은 __로 시작하고 끝나는 특별한 메소드입니다. 이 메소드들은 내부적으로 파이썬 인터프리터에 의해 호출되며, 사용자가 직접 호출하는 것이 아니라 자동으로 호출됩니다.

 

1. 개념

 

매직 메소드는 객체의 생성, 소멸, 문자열 표현, 연산자 오버로딩, 컨테이너 타입 지원 등 다양한 기능을 지원합니다. 이를테면, __init__ 메소드는 객체 생성 시 초기화를 위해 호출되며, __str__ 메소드는 객체를 문자열로 변환해 출력하는 데 사용됩니다.

아래는 몇 가지 대표적인 매직 메소드의 예시입니다.

  • __init__(self[, ...]): 객체가 생성될 때 호출되는 생성자 메소드입니다.
  • __del__(self): 객체가 소멸될 때 호출되는 소멸자 메소드입니다.
  • __str__(self): 객체를 문자열로 변환할 때 호출되는 메소드입니다.
  • __repr__(self): 객체를 표현하는 문자열을 반환하는 메소드입니다.
  • __add__(self, other): 덧셈 연산자(+)를 오버로딩한 메소드입니다.
  • __len__(self): 컨테이너 객체의 길이를 반환하는 메소드입니다.


이외에도 많은 매직 메소드들이 있으며, 필요에 따라 구현하여 사용할 수 있습니다.

 

2. 예제 코드

 

간단한 클래스 예제를 작성해 보겠습니다.

 

class Rectangle:
    def __init__(self, width, height):
        self.width = width
        self.height = height
    
    def area(self):
        return self.width * self.height
    
    def __str__(self):
        return f"Rectangle(width={self.width}, height={self.height})"
    
    def __repr__(self):
        return f"Rectangle({self.width}, {self.height})"
    
    def __eq__(self, other):
        if isinstance(other, Rectangle):
            return self.width == other.width and self.height == other.height
        return False
    
    def __lt__(self, other):
        if isinstance(other, Rectangle):
            return self.area() < other.area()
        return NotImplemented


위 코드에서는 Rectangle 클래스를 정의하고, 여러 매직 메소드를 구현하였습니다. 이 클래스는 사각형을 표현하며, __init__ 메소드로 초기화를 수행합니다. area 메소드는 사각형의 넓이를 계산하여 반환합니다.

__str__ 메소드는 객체를 문자열로 변환하여 출력합니다. __repr__ 메소드는 객체를 표현하는 문자열을 반환합니다.

__eq__ 메소드는 객체의 동등성 비교를 수행합니다. 이 예제에서는 두 개의 Rectangle 객체의 너비와 높이가 모두 같으면 같은 객체로 처리합니다.

__lt__ 메소드는 객체의 대소 비교를 수행합니다. 이 예제에서는 사각형의 넓이를 기준으로 작은 객체를 반환합니다.

이 클래스를 사용하여 객체를 생성하고, 매직 메소드를 호출해 보겠습니다.

 

r1 = Rectangle(3, 4)
r2 = Rectangle(5, 6)

print(r1)       # 출력: Rectangle(width=3, height=4)
print(repr(r2))  # 출력: Rectangle(5, 6)

print(r1 == r2)  # 출력: False
print(r1 < r2)   # 출력: True


위 코드에서는 Rectangle 클래스를 사용하여 r1과 r2 객체를 생성합니다. 그리고 __str__ 메소드와 __repr__ 메소드를 사용하여 객체를 출력합니다.

__eq__ 메소드와 __lt__ 메소드를 사용하여 객체를 비교합니다. r1과 r2의 동등성 비교는 False를 반환하며, 대소 비교는 r1이 r2보다 작은 객체이므로 True를 반환합니다.

 

3. 주의 사항

1) 이름 규칙을 따르세요

매직 메소드는 __로 시작하고 끝나는 이름을 가져야 합니다. 예를 들어, __init__ 메소드는 객체를 초기화하는 생성자 메소드입니다.

2) 오버로딩한 연산자를 사용할 때는 NotImplemented를 반환하세요

매직 메소드를 사용하여 연산자를 오버로딩할 때, 연산을 수행할 수 없는 경우 NotImplemented를 반환해야 합니다. 이를 통해 파이썬은 다른 객체 타입에 대한 연산자 오버로딩을 시도할 수 있습니다.

3) 매직 메소드는 객체의 내부 상태를 변경할 수 있습니다

매직 메소드를 구현할 때에는 객체의 내부 상태를 변경할 수 있습니다. 예를 들어, __add__ 메소드를 사용하여 덧셈 연산자를 오버로딩하면, 두 객체를 더한 결과를 반환하는 대신 첫 번째 객체의 상태를 변경할 수 있습니다.

4) 매직 메소드의 사용이 과도할 수 있습니다

매직 메소드는 파이썬에서 객체 지향 프로그래밍을 더욱 효과적으로 구현할 수 있도록 도와줍니다. 그러나 이들을 과도하게 사용하면 코드를 이해하기 어려워질 수 있습니다. 적절하게 사용해야 합니다.

5) 매직 메소드는 오버라이딩할 때 부모 클래스의 매직 메소드를 호출하세요

파이썬은 매직 메소드를 오버라이딩하는 경우, 부모 클래스의 매직 메소드를 호출하도록 권장합니다. 이는 다중 상속과 같은 상황에서 의도하지 않은 동작을 방지하는 데 도움이 됩니다.

 

'개념' 카테고리의 다른 글

[파이썬] all(), any() 함수 사용법  (0) 2023.03.11
[파이썬] 네임 맹글링 (name mangling)  (0) 2023.03.11
[파이썬] BFS 예제 코드  (0) 2023.03.11
[파이썬] DFS 구현  (0) 2023.03.11
[파이썬] namedtuple 이란  (0) 2023.03.11