Menu
Coddy logo textTech

매직 메소드 소개

Coddy Python 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 64개 중 33번째.

매직 메서드(Magic methods, 던더(dunder) 메서드라고도 함)는 시작과 끝에 이중 밑줄이 있는 특별한 메서드입니다. 파이썬은 특정 연산에 반응하여 이들을 자동으로 호출합니다.

다음은 매직 메서드를 사용한 클래스의 예입니다:

class Book:
    def __init__(self, title, author, pages):
        self.title = title
        self.author = author
        self.pages = pages
    
    def __str__(self):
        return f"{self.title} by {self.author}"

__init__ 메서드는 객체를 생성할 때 자동으로 호출됩니다:

my_book = Book("Python Programming", "John Smith", 350)

__str__ 메서드는 객체를 문자열로 변환할 때 자동으로 호출됩니다:

print(my_book)        # 자동으로 __str__을 호출합니다
print(str(my_book))   # 역시 __str__을 호출합니다

출력:

Python Programming by John Smith
Python Programming by John Smith

__str__이 없으면, 출력 시 객체의 메모리 위치가 표시됩니다:

class SimpleBook:
    def __init__(self, title):
        self.title = title

simple = SimpleBook("Test Book")
print(simple)  # <__main__.SimpleBook object at 0x...>

길이를 위한 또 다른 매직 메서드를 추가합니다:

class Book:
    def __init__(self, title, author, pages):
        self.title = title
        self.author = author
        self.pages = pages
    
    def __str__(self):
        return f"{self.title} by {self.author}"
    
    def __len__(self):
        return self.pages

my_book = Book("Python Programming", "John Smith", 350)
print(len(my_book))   # 자동으로 __len__을 호출합니다

출력:

350

핵심 포인트: 매직 메서드는 이중 밑줄(__method__)로 시작하고 끝나며, 파이썬에 의해 자동으로 호출됩니다. 이러한 메서드들은 객체가 str(), len()과 같은 내장 함수 및 연산자와 함께 작동할 수 있게 하여, 클래스를 더욱 파이썬답고(Pythonic) 직관적으로 사용할 수 있게 만들어 줍니다.

challenge icon

챌린지

쉬움

이 챌린지에서는 매직 메서드를 사용하여 Counter 클래스를 구현합니다.

  • counter.py - 구현을 안내하는 TODO 주석이 포함된, 수정해야 할 파일입니다.
  • driver.py - 광범위한 테스트 케이스가 포함되어 있습니다.

TODO 주석에 따라 counter.pyCounter 클래스를 구현하고 driver.py의 테스트 케이스를 실행하세요. 이 클래스는 선택적 값을 이용한 초기화, 문자열 표현 및 덧셈 연산을 지원해야 합니다.

치트 시트

매직 메서드(dunder 메서드)는 파이썬이 특정 작업에 대응하여 자동으로 호출하는, 이중 밑줄이 붙은 특별한 메서드입니다.

주요 매직 메서드:

  • __init__ - 객체를 생성할 때 호출됩니다
  • __str__ - str() 또는 print()를 사용하여 문자열로 변환할 때 호출됩니다
  • __len__ - len() 함수를 사용할 때 호출됩니다
class Book:
    def __init__(self, title, author, pages):
        self.title = title
        self.author = author
        self.pages = pages
    
    def __str__(self):
        return f"{self.title} by {self.author}"
    
    def __len__(self):
        return self.pages

my_book = Book("Python Programming", "John Smith", 350)
print(my_book)        # __str__을 자동으로 호출합니다
print(len(my_book))   # __len__을 자동으로 호출합니다

__str__이 없으면, 출력 시 읽기 쉬운 형식 대신 객체의 메모리 위치가 표시됩니다.

직접 해보기

# TODO: counter.py에서 Counter 클래스를 가져오세요
# 형식: from counter import Counter

# 종합 테스트 케이스 처리기
test_case = input()

if test_case == "init_test":
    # TODO: 기본값으로 초기화 테스트
    # 인자 없이 카운터를 생성하고 출력하세요
    # 예상 출력: "Count: 0"
    pass

elif test_case == "init_with_value":
    # TODO: 특정 값으로 초기화 테스트
    # 초기값 10으로 카운터를 생성하고 출력하세요
    # 참고: print()는 암시적으로 __str__을 호출하지만, 여기서는 __init__ 테스트에 집중합니다
    # 예상 출력: "Count: 10"
    pass


elif test_case == "addition":
    # TODO: 덧셈 연산 테스트
    # 값이 3인 카운터를 생성하고, 7을 더한 뒤 결과를 출력하세요
    # 예상 출력: "Count: 10"
    pass

elif test_case == "chained_addition":
    # TODO: 체인형(연속) 덧셈 연산 테스트
    # 값이 1인 카운터를 생성하고, 2를 더한 다음 결과에 3을 더하고 출력하세요
    # 예상 출력: "Count: 6"
    pass

elif test_case == "negative_values":
    # TODO: 음수 값 테스트
    # 값이 -5인 카운터를 생성하고 출력하세요
    # 그런 다음 -3을 더하고 결과를 출력하세요
    # 예상 출력: "Count: -5" 및 "Count: -8"
    pass

elif test_case == "zero_value":
    # TODO: 0 값 테스트
    # 값이 0인 카운터를 생성하고, 0을 더한 뒤 출력하세요
    # 예상 출력: "Count: 0"
    pass

elif test_case == "large_values":
    # TODO: 큰 값 테스트
    # 값이 1000000인 카운터를 생성하고 9000000을 더하세요
    # 예상 출력: "Count: 10000000"
    pass

elif test_case == "multiple_counters":
    # TODO: 여러 카운터 간의 상호작용 테스트
    # 값이 5인 counter1과 값이 10인 counter2를 생성하세요
    # 두 카운터를 모두 출력하세요
    # 예상 출력: "Count: 5" 및 "Count: 10"
    pass

elif test_case == "type_validation":
    # TODO: 다른 타입 더하기 테스트
    # 값이 5인 카운터에 실수(2.5)를 더해 보세요
    # 예상 출력: "Count: 7.5"
    pass
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

Object Oriented Programming의 모든 레슨