파이썬의 매직 메소드(Magic Method), 즉 던더 메소드(Dunder Method)는 객체 지향 프로그래밍에서 다양하고 유용한 기능을 구현할 수 있게 해주는 특별한 메소드입니다. 이 메소드들은 이름 앞뒤에 이중 언더스코어(__)가 붙는 것이 특징이며, 특정 조건이 충족되면 자동으로 호출되는 인터셉터 역할을 수행합니다.
대표적인 예로 __repr__은 객체의 공식(official) 문자열 표현을 계산하는 내장 함수이고, __str__은 객체의 비공식(informal) 문자열 표현을 계산하는 내장 함수입니다.
기본 예제: 객체 출력하기
먼저 간단한 클래스를 만들어 객체를 생성하고 출력해 보겠습니다.
class String:
# 객체를 초기화하는 매직 메소드
def __init__(self, string):
self.string = string
# 실행 코드
if __name__ == '__main__':
# 객체 생성
my_string = String('Python')
# 객체 위치 출력
print(my_string)
실행 결과
<__main__.String object at 0x000000BF0D411908>
객체를 그냥 출력하면 위와 같이 객체가 저장된 메모리 주소만 표시됩니다. 이제 __repr__ 메소드를 추가해 보겠습니다.
__repr__ 메소드 추가하기
class String:
# 객체를 초기화하는 매직 메소드
def __init__(self, string):
self.string = string
# 문자열 객체를 출력하는 매직 메소드
def __repr__(self):
return 'Object: {}'.format(self.string)
# 실행 코드
if __name__ == '__main__':
# 객체 생성
my_string = String('Python')
print(my_string)
실행 결과
Object: Python
__repr__ 메소드를 정의하자 객체를 출력할 때 사람이 읽기 좋은 형태로 표시됩니다.
문자열 연결 시도하기
이번에는 String 객체에 일반 문자열을 더해 보겠습니다.
class String:
# 객체를 초기화하는 매직 메소드
def __init__(self, string):
self.string = string
# 문자열 객체를 출력하는 매직 메소드
def __repr__(self):
return 'Object: {}'.format(self.string)
# 실행 코드
if __name__ == '__main__':
# 객체 생성
my_string = String('Python')
# String 객체와 문자열 연결 시도
print(my_string + ' Program')
실행 결과
TypeError: unsupported operand type(s) for +: 'String' and 'str'
+ 연산자를 사용하려 했지만 TypeError가 발생합니다. 파이썬은 String 클래스에 덧셈 동작이 정의되어 있지 않기 때문입니다.
__add__ 메소드로 해결하기
String 클래스에 __add__ 메소드를 추가하면 문제가 해결됩니다.
class String:
# 객체를 초기화하는 매직 메소드
def __init__(self, string):
self.string = string
# 문자열 객체를 출력하는 매직 메소드
def __repr__(self):
return 'Object: {}'.format(self.string)
# + 연산자 오버로딩 매직 메소드
def __add__(self, other):
return self.string + other
# 실행 코드
if __name__ == '__main__':
# 객체 생성
my_string = String('Hello')
# String 객체와 문자열 연결
print(my_string + ' Python')
실행 결과
Hello Python
이처럼 매직 메소드를 활용하면 + 연산자 오버로딩, 객체 출력 형식 지정 등 파이썬 클래스의 기본 동작을 자유롭게 커스터마이징할 수 있습니다. __init__, __repr__, __str__, __add__ 외에도 __len__, __eq__, __getitem__ 등 다양한 던더 메소드를 익혀두면 더욱 파이써닉한 코드를 작성할 수 있습니다.