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
결론
파이썬의 더블 언더 메서드는 객체의 동작을 맞춤화하고, 연산자 오버로딩, 객체의 생명주기 관리, 이터레이션 제어, 함수 호출 동작 등을 정의하는 데 매우 중요한 역할을 합니다. 이 메서드들은 파이썬 객체를 더욱 강력하고 유연하게 만들 수 있는 방법을 제공합니다.
'실용적인 자료구조' 카테고리의 다른 글
[실용적인 자료구조] 리스트 상속 원형 큐(Circular Queue) 자료구조 (2) | 2024.10.18 |
---|---|
[실용적인 자료구조] 타임 트랙(Time Track) 자료구조 (0) | 2024.10.18 |
[실용적인 자료구조] 이중 연결 리스트(Doubly Linked List) (0) | 2024.10.17 |
[실용적인 자료구조] Python의 `object` 클래스 1 (0) | 2024.10.17 |
[실용적인 자료구조] 리스트를 상속한 `NamedList` 클래스 (1) | 2024.10.16 |