파이썬 클래스에서 스페셜 메서드(Special Methods) 또는 매직 메서드(Magic Methods)는 특정 상황에서 자동으로 호출되는 특별한 메서드들이다. 이러한 메서드는 이중 밑줄(__
)로 시작하고 끝나며, 객체의 특수한 동작을 정의하는 데 사용된다. 스페셜 메서드는 클래스의 인스턴스가 기본 데이터 타입처럼 동작할 수 있게 해준다.
주요 스페셜 메서드
__init__(self, ...)
- 초기화 메서드
객체가 생성될 때 호출되어 인스턴스 변수를 초기화한다.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
__str__(self)
- 문자열 표현
print()
함수로 객체를 출력할 때 호출되어 사람이 읽기 쉬운 형태로 반환한다.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"{self.name}, {self.age}살"
person = Person("홍길동", 30)
print(person) # 홍길동, 30살 출력
__repr__(self)
- 공식 문자열 표현
객체의 “공식적인” 문자열 표현을 반환하며, 주로 디버깅을 위해 사용된다.
repr()
함수나 인터프리터에서 객체를 출력할 때 호출된다.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f"Person(name={self.name}, age={self.age})"
person = Person("홍길동", 30)
print(repr(person)) # Person(name=홍길동, age=30) 출력
__len__(self)
- 길이 반환
len()
함수가 호출될 때 객체의 길이를 반환한다.
class CustomList:
def __init__(self, items):
self.items = items
def __len__(self):
return len(self.items)
custom_list = CustomList([1, 2, 3, 4, 5])
print(len(custom_list)) # 5 출력
__getitem__(self, key)
- 인덱싱
객체가 인덱싱될 때 호출되어 해당 키에 해당하는 값을 반환한다.
class CustomList:
def __init__(self, items):
self.items = items
def __getitem__(self, index):
return self.items[index]
custom_list = CustomList([1, 2, 3, 4, 5])
print(custom_list[2]) # 3 출력
__setitem__(self, key, value)
- 인덱싱을 통한 값 설정
객체의 특정 키에 값을 설정할 때 호출된다.
class CustomList:
def __init__(self, items):
self.items = items
def __getitem__(self, index):
return self.items[index]
def __setitem__(self, index, value):
self.items[index] = value
custom_list = CustomList([1, 2, 3, 4, 5])
custom_list[2] = 10
print(custom_list[2]) # 10 출력
__delitem__(self, key)
- 인덱싱을 통한 값 삭제
객체의 특정 키에 해당하는 값을 삭제할 때 호출된다.
class CustomList:
def __init__(self, items):
self.items = items
def __delitem__(self, index):
del self.items[index]
custom_list = CustomList([1, 2, 3, 4, 5])
del custom_list[2]
print(custom_list.items) # [1, 2, 4, 5] 출력
__call__(self, ...)
- 함수처럼 호출
객체가 함수처럼 호출될 때 실행된다.
class Adder:
def __init__(self, value):
self.value = value
def __call__(self, x):
return self.value + x
adder = Adder(10)
print(adder(5)) # 15 출력
__eq__
메서드 - 동등성 비교
__eq__
메서드는 두 객체의 동등성을 비교하기 위해 사용된다. 이 메서드는 ==
연산자가 사용될 때 호출된다.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __eq__(self, other):
if isinstance(other, Person):
return self.name == other.name and self.age == other.age
return False
# 객체 생성
person1 = Person("홍길동", 30)
person2 = Person("홍길동", 30)
person3 = Person("김철수", 25)
# 동등성 비교
print(person1 == person2) # True 출력
print(person1 == person3) # False 출력
__hash__
메서드 - 해시 반환
__hash__
메서드는 객체의 해시 값을 반환하며, 해시 테이블에서 객체를 사용할 수 있도록 한다. 해시 값은 set
과 dict
와 같은 해시 기반 컬렉션에서 객체를 키로 사용할 때 필요하다.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __eq__(self, other):
if isinstance(other, Person):
return self.name == other.name and self.age == other.age
return False
def __hash__(self):
return hash((self.name, self.age))
# 객체 생성
person1 = Person("홍길동", 30)
person2 = Person("홍길동", 30)
# 해시 값 확인
print(hash(person1)) # 해시 값 출력
print(hash(person2)) # 동일한 해시 값 출력
# 집합에 객체 추가
people = {person1, person2}
print(len(people)) # 1 출력, 동등한 객체는 하나로 간주