본문 바로가기
python

파이썬 기초 - 메서드 유형과 매직 메서드

by kyeongseo.oh 2025. 3. 22.

인스턴스 메서드

인스턴스 메서드는 클래스의 인스턴스에 대해 작동하는 가장 기본적인 메서드이다. 첫 번째 매개변수는 항상 self로, 메서드를 호출한 인스턴스 자신을 참조한다. 인스턴스에 종속적인 기능을 만들 때 사용한다. 인스턴스 변수의 값을 다루고 인스턴스마다에서 서로 다른 결과를 출력한다는 특징이 있다.

class Calculator:
    def __init__(self, value=0):
        self.value = value
        
    def add(self, x):
        self.value += x
        return self.value
        
    def subtract(self, x):
        self.value -= x
        return self.value
        
calc = Calculator(10)
print(calc.add(5))      # 출력: 15
print(calc.subtract(3)) # 출력: 12

classmethod

클래스 메서드는 인스턴스가 아닌 클래스 자체에서 작동하는 메서드이다. 첫 번째 매개변수는 관습적으로 cls로 명명하며, 클래스 자체를 참조한다. 클래스 단위로 관리되는 클래스 변수에 접근하기 때문에 그리고 클래스의 모든 인스턴스마다에서 같은 값을 다루고 출력한다. 

class Person:
    count = 0 # 클래스 변수
    
    def __init__(self, name):
        self.name = name # 인스턴스 변수
        Person.count += 1
        
    @classmethod
    def number_of_people(cls):
        return f"현재 {cls.count}명의 사람이 있습니다."
    
    @classmethod
    def create_anonymous(cls):
        return cls("익명") # Person("익명")과 동일
        
# 사용 예
person1 = Person("홍길동")
person2 = Person("김철수")
print(Person.number_of_people())  # 출력: 현재 2명의 사람이 있습니다.

anonymous = Person.create_anonymous()
print(anonymous.name)  # 출력: 익명

 

staticmethod

정적 메서드는 클래스나 인스턴스 상태에 접근하지 않는 메서드다. 클래스와 논리적으로 연관되어 있지만, 클래스나 인스턴스의 속성을 직접 변경하지 않는 경우에 사용할 수 있다. 인스턴스 변수를 사용할 수 없다는 특징이 있다.

class MathUtils:
    @staticmethod
    def add(x, y):
        return x + y
        
    @staticmethod
    def is_even(number):
        return number % 2 == 0
        
# 사용 예
print(MathUtils.add(5, 3))    # 출력: 8
print(MathUtils.is_even(6))   # 출력: True
print(MathUtils.is_even(7))   # 출력: False

 

매직 메서드(dunder 메서드)

매직 메서드(Magic Methods)는 이중 언더스코어(__)로 시작하고 끝나기 때문에 "던더(dunder) 메서드"라고도 불린다. 이 메서드들은 특정 상황에서 자동으로 호출된다.

초기화 및 표현 메서드

__init__

객체가 생성될 때 자동으로 호출되는 가장 기본적인 초기화 메서드

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        
# 사용 예
person = Person("홍길동", 30)  # __init__ 메소드 자동 호출

__str__

str() 함수나 print() 함수에서 호출된다. 해당 인스턴스에 대한 정보를 반환한다.

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        
    def __str__(self):
        return f"{self.name}, {self.age}세"
        
# 사용 예
person = Person("홍길동", 30)
print(person)  # 출력: 홍길동, 30세

__repr__

해당 인스턴스와 동일한 인스턴스를 다시 선언하는 방법을 반환한다.

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        
    def __repr__(self):
        return f"Person(name='{self.name}', age={self.age})"
        
# 사용 예
person = Person("홍길동", 30)
print(repr(person))  # 출력: Person(name='홍길동', age=30)

 

비교 메소드

__eq__

두 객체가 같은지 비교할 때 사용되는 메서드로 __eq__ 메서드를 정의하지 않으면 기본적으로 id() 값(즉, 객체의 메모리 주소)을 비교하여 서로 다른 객체로 취급한다.

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        
    def __eq__(self, other):
        if not isinstance(other, Person): # other가 Person 클래스의 인스턴스인지 확인
            return False
        return self.name == other.name and self.age == other.age
        
# 사용 예
person1 = Person("홍길동", 30)
person2 = Person("홍길동", 30)
person3 = Person("김철수", 25)

print(person1 == person2)  # 출력: True
print(person1 == person3)  # 출력: False

 

__lt__

"less than" 비교를 정의한다.

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        
    def __lt__(self, other):
        if not isinstance(other, Person):
            return NotImplemented
        return self.age < other.age
        
# 사용 예
person1 = Person("홍길동", 30)
person2 = Person("김철수", 25)

print(person1 < person2)  # 출력: False
print(person2 < person1)  # 출력: True

 

컨테이너 동작 메소드

컨테이너(Container)란 여러 개의 객체를 담고 관리하는 자료구조를 의미한다. 대표적으로 리스트(list), 튜플(tuple), 딕셔너리(dict), 집합(set) 등이 있다. 컨테이너 동작을 정의하는 주요 메서드 및 매직 메서드는 다음과 같다.

기본적인 컨테이너 동작 메서드

길이 확인 __len__ len(container) 호출 시 사용 len(my_list)
포함 여부 확인 __contains__ in 연산자 사용 시 호출 5 in my_list
반복(iteration) __iter__ for 문에서 사용 for x in my_list:
인덱싱 __getitem__ container[key] 사용 시 호출 my_list[0]
아이템 변경 __setitem__ container[key] = value 사용 시 호출 my_list[0] = 10
아이템 삭제 __delitem__ del container[key] 사용 시 호출 del my_list[0]

리스트 컨테이너 예제

class MyContainer:
    def __init__(self):
        self.data = []

    def __len__(self):
        return len(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]

    def __contains__(self, item):
        return item in self.data

    def __iter__(self):
        return iter(self.data)

# 사용 예
container = MyContainer()
container.data.append(10)
container.data.append(20)

print(len(container))      # 2
print(container[0])        # 10
container[1] = 30
print(container[1])        # 30
del container[0]
print(10 in container)     # False
for item in container:
    print(item)            # 30

댓글