던더 메소드, 처음 들어보셨나요? 솔직히 저도 처음엔 "이게 뭘까?" 싶었어요. 그런데 조금씩 배우다 보니, 이게 진짜 파이썬의 마법 같은 기능이더라고요. 이 메소드는 개발자가 객체를 다루는 방식을 마음대로 바꿀 수 있는 도구인데, 알고 나면 세상 모든 코드가 조금 다르게 보일 거예요. 오늘은 던더 메소드가 뭔지, 그리고 왜 이렇게 유용한지 얘기해볼게요. 같이 천천히 알아봐요!
던더 메소드란?
던더라는 이름이 조금 독특하죠? "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)
이 코드가 어떻게 동작하냐면요:
- 초기화:
__init__
메소드가 호출되면서 객체의 초기값을 설정합니다. - 문자열 표현:
__str__
메소드는 객체를 사람이 읽기 쉽게 문자열로 변환합니다. - 더하기 연산:
__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)
요약하자면
던더 메소드는 파이썬의 진짜 매력을 보여주는 기능이에요. 이걸 알면 코드가 훨씬 직관적이고 강력해져요. 자신만의 클래스를 만들어서 연산, 반복, 리소스 관리 등 다양한 상황에서 활용해보세요. 그렇게 하면 "파이썬답다"는 말이 무슨 뜻인지 몸소 느낄 수 있을 거예요.
'SW > Python' 카테고리의 다른 글
파이썬으로 돈 버는 법: 초보자를 위한 상세 가이드 및 실천 가능한 전략 (0) | 2025.02.07 |
---|---|
파이썬을 이용한 이메일 구독 취소 자동화: 단계별 가이드 (0) | 2024.12.15 |
파이썬 F-스트링 마스터하기: 더 깔끔하고 효율적인 코드 작성을 위한 필수 트릭들 (0) | 2024.12.09 |
파이썬 백엔드 개발자가 되는 완벽 가이드 (0) | 2024.12.01 |
Selenium에서 NoSuchWindowException 처리하는 방법 (0) | 2024.11.10 |