Python의 기본 - 매직 메서드 (11)

2026. 5. 23. 15:32AI/Python

매직 메서드(Magic Method)란, Python에서 특정 문법이나 연산이 될 때 자동으로 실행되는 특별한 메소드로

 

__len__, __str__, __getItem__ 처럼 양쪽 끝에 __이 붙는 형태를 가진다.

 

이 메소드들을 클래스에 구현하면, Python의 기본 문법과 자연스레 연결되어 객체의 동작을 직접 정의할 수 있다.

 

즉, 매직 메소드는 객체를 리스트처럼 사용하거나 연산을 수행하거나 출력 형태를 바꾸는 등

 

Python의 문법과 객체를 이어주는 핵심 기능이다.

 

객체 출력

 

1. __str__()

 

객체를 사람이 읽기 쉬운 문자열로 표현하기 위해 사용하며, print(obj)나, str(obj)가 호출 될 때 자동으로 실행된다.

 

이 메소드를 클래스에 정의(오버라이딩)하면 객체를 출력할 때 기본 주소값 대신 원하는 형태로 내용을 보여줄 수 있어

 

디버깅이나 사용자 출력에 매우 유용하다.

 

class Fruit:
  def __init__(self, name, quantity):
    self.name = name
    self.quantity = quantity
    
  def __str__(self):
    return f"{self.name} {self.quantity}개"
apple = Fruit("사과", 10)

print(apple) # 기존 : <__main__.Fruit object at 0x0000000000203666D3>
print(apple) # 매직 메소드 이후 : 사과 10개

 

2. __repr__()

 

객체를 개발자 관점에서 정확하게 표현하는 문자열을 반환하는 매직 메소드로

 

repr(obj)을 직접 호출하거나 인터프리터에서 객체를 직접 평가할 때 자동으로 호출되며 가능하다면

 

객체를 다시 생성할 수 있는 형태의 문자열을 반환하는 것이 권장된다.

 

__str__이 없으면 __repr__이 호출되는 방식이다. (__str__이 존재하면 __str__이 우선시된다)

class Fruit:
  def __init__(self, name, quantity):
    self.name = name
    self.quantity = quantity
    
  def __repr__(self):
    return f"Fruit(name="{self.name}", quantity="{self.quantity}")

 

제너레이터(Generator)

 

yield 키워드를 통해 값을 한번에 하나씩 생성해 반환하는 반복 객체로, 함수 형태로 간단하게 이터레이터를 만들 수 있다.

 

일반 함수처럼 보이지만, yield를 만나면 반환하면서도 실행 상태를 유지하고

 

다음 호출 시 이어서 실행되기 때문에 전체 데이터를 한번에 만들지 않고, 필요할 때마다 생성할 수 있어 메모리가 절약된다.

 

class Counter:
  def __init__(self, max):
    self.max = max
    self.current = 0
    
  def __iter__(self): # iter()
    return self
    
  def __next__(self): # next()
    if self.current < self.max:
      self.current += 1
      return self.current
    else:
      raise StopIteration

 

이 예시를 통해 알 수 있는 것은 for문은 내부적으로 자동적으로 iter()를 호출한다는 것이다.

 

이터레이터는 이터러블 객체로부터 실제로 하나씩 값을 꺼내는 객체로 __iter__()와 __next__() 메소드를 모두 구현하고 있다.

 

__iter__()는 반복을 시작하게 하고, __next__()는 값을 하나씩 꺼내며, 더 이상 반환할 값이 없으면, StopIteration 예외를 발생시킨다.

 

이를 제너레이터 형태로 구현해보자.

def counter(max):
  current = 0
  while current < max:
    current += 1
    yield current

 

yield 키워드를 통해 여러가지 코드를 자동으로 실행해주는데 yield는 다음을 의미한다.

 

1.  값을 반환한다.

2. 함수 상태를 저장한다

3. 다음 호출 시 이어서 실행한다

 

즉, 제네레이터는 자동으로  __iter__() + __next__()를 만들어주는 것이다

 

인덱싱

 

1. __getItem__()

 

객체에서 인덱스나 키를 이용해 값을 조회할 때 호출되는 매직 메소드로

 

obj[index] 혹은 obj[key]로 접근하면 자동 호출된다. 이 메소드를 구현하면 사용자 정의 객체도 리스트나 딕셔너리처럼

 

데이터를 꺼낼 수 있으며 내부적으로는 전달된 인덱스나 키를 기반으로 값을 반환하도록 작성하면 된다.

 

2. __setItem__()

 

객체에서 인덱스나 키를 이용해 값을 할당할 때 호출되는 매직 메소드로

 

obj[index] = value 형태의 코드가 실행되면 자동 호출된다. 이 메소드를 구현하면 사용자 정의 객체에 값을 저장하거나

 

수정하는 동작을 제어할 수 있으며, 전달된 인덱스나 값을 이용해 내부 데이터를 업데이트 하도록 구현한다.

 

3. __delItem__()

 

객체에서 인덱스나 키를 이용해 값을 삭제할 때 호출되는 매직 메소드로

 

del obj[index] 형태의 코드가 실행되면 자동 호출된다. 이 메소드를 구현하면 사용자의 정의 객체에서

 

특정 데이터를 삭제하는 로직을 정의할 수 있으며, 전달된 인덱스를 기반으로 내부 데이터를 제거하도록 작성한다.

 

class MyList:
  def __init__(self):
    self.data = []
    
  def __getItem__(self, index):
    return self.data[index]
    
  def __setItem__(self, index, value):
    self.data[index] = value
    
  def __delItem__(self, index):
    del self.data[index]

 

객체를 함수, 값 처럼 사용하기

 

1. __call__()

 

객체를 함수처럼 호출할 수 있게 만들어주는 매직 메소드로, obj() 형태로 객체를 실행하면 자동으로 호출된다.

 

이 메소드를 구현하면 클래스 인스턴스가 일반 함수처럼 동작할 수 있으며, 

 

내부 상태를 이용한 연산이나 처리 로직을 간결하게 표현할 수 있다.

class Multiplier:
  def __init__(self, n):
    self.n = n
    
  def __call__(self, x):
    return x * self.n

 

2. __len__()

 

객체의 길이를 정의하는 매직 메소드로, len(obj)를 호출할 때 자동 호출된다.

 

이 메소드를 구현하면 사용자 정의 객체도 리스트나 문자열처럼 길이를 가질 수 있으며, 내부 데이터의 개수를 반환하도록 작성한다.

class Basket:
  def __init__(self):
    self.items = []
    
  def __len__(self):
    return len(self.items)

 

With 문

 

 파일, 네트워크, DB 연결처럼 사용 후 반드시 정리(Clean-Up)가 필요한 자원을 안전하게 관리하기 위한 방법으로

 

블록이 시작될 때 필요한 작업을 수행하고 종료될 때까지 자동으로 정리 작업을 실행해준다.

 

이를 통해 try - finally를 직접 작성하지 않아도 되고, 예외가 발생하더라도 자원이 정상적으로 해제되도록 유지된다.

 

1. __enter__()

 

with 문에 진입할 때 자동으로 호출되는 매직 메소드로 자원을 준비하거나 초기화하는 역할을 한다.

 

이 메소드에서 반환값은 as 뒤의 변수에 할당되어 with 블록 내부에서 사용된다.

 

2. __exit__()

 

with 블록이 끝날 때 자동으로 호출되는 매직 메소드로, 사용한 자원을 정리하는 역할을 한다.

 

이 메소드는 예외 발생과 관계없이 반드시 실행되며, 예외가 발생한 경우에는 예외 타입 값, trackback 정보를

 

인자로 받아 처리할 수 있다.