Python에서 "더블 언더 메소드(double underscore methods)", 또는 "던더 메소드(dunder methods)"는 메서드 이름이 두 개의 밑줄(__)로 시작하고 끝나는 메서드들을 의미합니다. 이러한 메서드들은 특별한 목적으로 사용되며, Python에서 객체의 특정 동작을 정의하거나 제어하는 데 사용됩니다. 예를 들어, 객체의 생성, 문자열 표현, 연산자 오버로딩 등을 처리하는 데 중요한 역할을 합니다.

주요 더블 언더 메서드와 그 역할

1. __init__(self, ...)

  • 역할: 객체가 생성될 때 초기화하는 생성자 메서드입니다.

  • 호출 시점: 객체가 인스턴스화될 때 자동으로 호출됩니다.

    class MyClass:
        def __init__(self, name):
            self.name = name
    
    obj = MyClass("Alice")
    print(obj.name)  # 출력: Alice

2. __new__(cls, ...)

  • 역할: 객체의 메모리를 할당하고 실제 객체를 생성하는 메서드입니다. __init__ 메서드보다 먼저 호출됩니다.

  • 호출 시점: 객체가 생성되기 전에 호출됩니다.

    class MyClass:
        def __new__(cls, name):
            instance = super(MyClass, cls).__new__(cls)
            return instance
    
        def __init__(self, name):
            self.name = name
    
    obj = MyClass("Alice")
    print(obj.name)  # 출력: Alice

3. __str__(self)

  • 역할: 객체의 "사용자 친화적인" 문자열 표현을 반환하는 메서드입니다. print()와 같은 함수가 호출될 때 사용됩니다.

    class MyClass:
        def __init__(self, name):
            self.name = name
    
        def __str__(self):
            return f"MyClass object with name: {self.name}"
    
    obj = MyClass("Alice")
    print(obj)  # 출력: MyClass object with name: Alice

4. __repr__(self)

  • 역할: 객체의 "공식적인" 문자열 표현을 반환하는 메서드입니다. 객체를 재현(reproduce)할 수 있는 문자열을 반환하는 것이 목표입니다. 주로 디버깅에 사용되며, repr() 함수나 인터프리터에서 객체를 출력할 때 호출됩니다.

    class MyClass:
        def __init__(self, name):
            self.name = name
    
        def __repr__(self):
            return f"MyClass(name={self.name!r})"
    
    obj = MyClass("Alice")
    print(repr(obj))  # 출력: MyClass(name='Alice')

5. __len__(self)

  • 역할: 객체의 길이나 크기를 반환하는 메서드입니다. len() 함수가 호출될 때 사용됩니다.

    class MyList:
        def __init__(self, items):
            self.items = items
    
        def __len__(self):
            return len(self.items)
    
    my_list = MyList([1, 2, 3, 4])
    print(len(my_list))  # 출력: 4

6. __getitem__(self, key)

  • 역할: 객체가 인덱싱 또는 슬라이싱될 때 호출되는 메서드입니다. obj[key]와 같은 구문에서 동작합니다.

    class MyList:
        def __init__(self, items):
            self.items = items
    
        def __getitem__(self, index):
            return self.items[index]
    
    my_list = MyList([1, 2, 3, 4])
    print(my_list[1])  # 출력: 2

7. __setitem__(self, key, value)

  • 역할: 객체의 특정 인덱스에 값을 할당할 때 호출되는 메서드입니다. obj[key] = value 구문에서 동작합니다.

    class MyList:
        def __init__(self, items):
            self.items = items
    
        def __setitem__(self, index, value):
            self.items[index] = value
    
    my_list = MyList([1, 2, 3, 4])
    my_list[1] = 10
    print(my_list.items)  # 출력: [1, 10, 3, 4]

8. __delitem__(self, key)

  • 역할: 객체의 특정 인덱스를 삭제할 때 호출됩니다. del obj[key] 구문에서 사용됩니다.

    class MyList:
        def __init__(self, items):
            self.items = items
    
        def __delitem__(self, index):
            del self.items[index]
    
    my_list = MyList([1, 2, 3, 4])
    del my_list[1]
    print(my_list.items)  # 출력: [1, 3, 4]

9. __eq__(self, other)

  • 역할: 두 객체가 같은지 비교하는 메서드로, == 연산자가 사용될 때 호출됩니다.

    class MyClass:
        def __init__(self, value):
            self.value = value
    
        def __eq__(self, other):
            if isinstance(other, MyClass):
                return self.value == other.value
            return False
    
    obj1 = MyClass(10)
    obj2 = MyClass(10)
    print(obj1 == obj2)  # 출력: True

10. __lt__(self, other), __gt__(self, other)

  • 역할: 객체 간의 비교 연산자(<, >, <=, >=)가 사용될 때 호출됩니다.

    class MyClass:
        def __init__(self, value):
            self.value = value
    
        def __lt__(self, other):
            return self.value < other.value
    
    obj1 = MyClass(10)
    obj2 = MyClass(20)
    print(obj1 < obj2)  # 출력: True

11. __call__(self, *args, **kwargs)

  • 역할: 객체를 함수처럼 호출할 수 있게 해주는 메서드입니다.

    class MyClass:
        def __call__(self, x):
            return x * 2
    
    obj = MyClass()
    print(obj(5))  # 출력: 10

12. __iter__(self)__next__(self)

  • 역할: 이 메서드들은 객체를 이터레이터로 만들기 위해 사용됩니다. __iter__는 반복자를 반환하고, __next__는 각 반복 시 호출되어 다음 요소를 반환합니다.

    class MyRange:
        def __init__(self, start, end):
            self.start = start
            self.end = end
            self.current = start
    
        def __iter__(self):
            return self
    
        def __next__(self):
            if self.current >= self.end:
                raise StopIteration
            self.current += 1
            return self.current - 1
    
    my_range = MyRange(1, 5)
    for num in my_range:
        print(num)  # 출력: 1, 2, 3, 4

결론

파이썬의 더블 언더 메서드는 객체의 동작을 맞춤화하고, 연산자 오버로딩, 객체의 생명주기 관리, 이터레이션 제어, 함수 호출 동작 등을 정의하는 데 매우 중요한 역할을 합니다. 이 메서드들은 파이썬 객체를 더욱 강력하고 유연하게 만들 수 있는 방법을 제공합니다.

+ Recent posts