SW/Python

파이썬의 진짜 매력: 던더 메소드 완벽 가이드

얇은생각 2025. 2. 13. 07:30
반응형

던더 메소드, 처음 들어보셨나요? 솔직히 저도 처음엔 "이게 뭘까?" 싶었어요. 그런데 조금씩 배우다 보니, 이게 진짜 파이썬의 마법 같은 기능이더라고요. 이 메소드는 개발자가 객체를 다루는 방식을 마음대로 바꿀 수 있는 도구인데, 알고 나면 세상 모든 코드가 조금 다르게 보일 거예요. 오늘은 던더 메소드가 뭔지, 그리고 왜 이렇게 유용한지 얘기해볼게요. 같이 천천히 알아봐요!

 

파이썬의 진짜 매력: 던더 메소드 완벽 가이드

 

 

던더 메소드란?

던더라는 이름이 조금 독특하죠? "Double UNDerscore"라는 뜻으로, 메소드 이름 앞뒤에 밑줄 두 개가 붙어 있는 걸 말해요. 예를 들면 __init__, __str__, __add__ 같은 것들이 있죠. 이 메소드들은 단순히 동작을 정의하는 걸 넘어서, 파이썬 문법을 이렇게 직관적으로 사용할 수 있게 만드는 핵심이에요. 숨겨진 비밀 도구랄까요?

간단한 예를 들어볼게요. __init__ 메소드는 객체를 생성할 때 자동으로 호출되는 메소드예요. 코드로 보면 이해가 훨씬 쉬울 거예요:

class Rectangle:
    def __init__(self, width, height):
        self.width = width
        self.height = height

# Rectangle 객체 생성
rect = Rectangle(2, 3)

이 코드에서 __init__ 메소드는 Rectangle 객체가 만들어질 때 자동으로 실행됩니다. 편리하죠? 그런데 이게 끝이 아니에요. 파이썬에는 이 외에도 엄청나게 많은 던더 메소드가 있고, 이를 통해 객체의 동작을 원하는 대로 정의할 수 있어요. 진짜 자유도가 어마어마하답니다.


 

파이썬에서 모든 것은 객체다

파이썬의 진짜 매력은 모든 게 객체라는 거예요. 정말 모든 게요! 문자열, 숫자, 함수, 심지어 클래스 자체도 객체예요. 이게 무슨 말인지 코드로 보여드릴게요:

def example_function():
    return "나는 함수입니다"

print(type(example_function))  # 출력: <class 'function'>

이렇게 함수도 사실 객체입니다. 그러니까 파이썬에서 일어나는 모든 일은 객체 뒤에 있는 클래스 덕분이라고 보면 돼요. 예를 들어, 문자열끼리 더하기(+)를 하면 사실 __add__ 메소드가 호출됩니다. 심지어 len() 함수도 __len__ 메소드를 호출하는 거예요. 알고 보면 파이썬이 얼마나 체계적이고 논리적인 언어인지 감탄하게 되실 거예요.


 

예제: 문자열 더하기와 __add__

문자열을 더하는 코드는 자주 보셨을 거예요:

string1 = "안녕하세요 "
string2 = "세계"
result = string1 + string2
print(result)  # 출력: 안녕하세요 세계

 

이렇게 간단해 보이지만, 사실 파이썬 내부적으로는 이런 식으로 처리됩니다:

result = string1.__add__(string2)

 

놀랍지 않나요? string1이라는 객체가 __add__ 메소드를 호출해서 string2를 더하는 거예요. 덕분에 +라는 기호 하나만으로도 문자열을 쉽게 합칠 수 있는 거죠.

비슷하게, len() 함수도 __len__ 메소드를 호출합니다:

print(len(string1))  # 출력: 6
print(string1.__len__())  # 출력: 6

 

이런 걸 알고 나면, 나만의 클래스를 만들어서 특별한 동작을 추가해보고 싶어질 거예요. 진짜 재밌어요!


 

나만의 던더 메소드 만들어보기

직접 만들어보는 게 제일 이해가 빠르죠. 이번엔 간단한 Counter 클래스를 만들어볼게요. 이 클래스는 숫자를 더하거나 출력할 수 있는 기능을 가질 거예요.

class Counter:
    def __init__(self, value):
        self.value = value

    def __str__(self):
        return f"Counter(value={self.value})"

    def __add__(self, other):
        if isinstance(other, Counter):
            return Counter(self.value + other.value)
        raise TypeError("Counter 객체끼리만 더할 수 있습니다")

# 사용 예시
counter1 = Counter(2)
counter2 = Counter(3)
result = counter1 + counter2
print(result)  # 출력: Counter(value=5)

 

이 코드가 어떻게 동작하냐면요:

  1. 초기화: __init__ 메소드가 호출되면서 객체의 초기값을 설정합니다.
  2. 문자열 표현: __str__ 메소드는 객체를 사람이 읽기 쉽게 문자열로 변환합니다.
  3. 더하기 연산: __add__ 메소드는 두 Counter 객체를 더할 수 있도록 도와줍니다.

 

이렇게 던더 메소드를 활용하면, 코드가 더 자연스럽고 직관적으로 느껴지지 않나요?

 


던더 메소드로 할 수 있는 것들

1. 산술 연산

  • __add__: 더하기 (+)
  • __sub__: 빼기 (-)
  • __mul__: 곱하기 (*)
  • __truediv__: 나누기 (/)
  • __floordiv__: 몫 (//)
  • __mod__: 나머지 (%)

 

2. 비교 연산

  • __eq__: 같음 (==)
  • __lt__: 작음 (<)
  • __le__: 작거나 같음 (<=)
  • __gt__: 큼 (>)
  • __ge__: 크거나 같음 (>=)

 

3. 객체 표현

  • __str__: 사용자 친화적 문자열 표현
  • __repr__: 디버깅을 위한 개발자 친화적 표현

 

4. 컨테이너 동작

  • __getitem__: 인덱스로 값 가져오기
  • __setitem__: 인덱스로 값 설정하기
  • __delitem__: 인덱스로 값 삭제하기
  • __len__: 길이 반환

 


 

고급 활용: 던더 메소드의 숨은 매력

컨텍스트 매니저: __enter____exit__

파일을 열고 닫는 거, 은근 귀찮죠? 컨텍스트 매니저를 사용하면 이런 번거로움을 줄일 수 있어요. 예제를 볼게요:

class DatabaseConnection:
    def __enter__(self):
        print("데이터베이스에 연결되었습니다.")
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        print("데이터베이스 연결이 종료되었습니다.")

# 사용 예시
with DatabaseConnection() as db:
    print("작업 중")
# 출력:
# 데이터베이스에 연결되었습니다.
# 작업 중
# 데이터베이스 연결이 종료되었습니다.

 

 

반복자: __iter____next__

반복 가능한 객체를 직접 만들어보는 것도 꽤 재밌어요. 아래처럼요:

class Countdown:
    def __init__(self, start):
        self.current = start

    def __iter__(self):
        return self

    def __next__(self):
        if self.current <= 0:
            raise StopIteration
        self.current -= 1
        return self.current

# 사용 예시
for number in Countdown(5):
    print(number)

 


 

요약하자면

던더 메소드는 파이썬의 진짜 매력을 보여주는 기능이에요. 이걸 알면 코드가 훨씬 직관적이고 강력해져요. 자신만의 클래스를 만들어서 연산, 반복, 리소스 관리 등 다양한 상황에서 활용해보세요. 그렇게 하면 "파이썬답다"는 말이 무슨 뜻인지 몸소 느낄 수 있을 거예요.

반응형