인스턴스 메서드
인스턴스 메서드는 클래스의 인스턴스에 대해 작동하는 가장 기본적인 메서드이다. 첫 번째 매개변수는 항상 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
'python' 카테고리의 다른 글
파이썬 기초 - 유용한 자료구조 - collections와 enum (0) | 2025.03.23 |
---|---|
파이썬 기초 - 메타 클래스와 추상 클래스 (0) | 2025.03.23 |
파이썬 기초 - 클래스 속성 관리와 접근 제어 (0) | 2025.03.20 |
파이썬 기초 - Decorator (0) | 2025.03.20 |
파이썬 기초 - 예외처리 (0) | 2025.03.19 |
댓글