Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 던더(Dunder) 매직 메소드 완벽 가이드

파이썬의 매직 메소드(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__ 등 다양한 던더 메소드를 익혀두면 더욱 파이써닉한 코드를 작성할 수 있습니다.