파이썬에서는 클래스에서 다양한 종류의 메소드를 정의할 수 있습니다. 이 포스팅에서는 인스턴스 메소드, 클래스 메소드, 정적 메소드의 차이와 그 각각의 사용법을 코드와 함께 알아보겠습니다.
1. 인스턴스 메소드 (Instance Method)
정의 및 특징
- 인스턴스 메소드는 클래스의 인스턴스에서 호출되는 메소드입니다.
- 메소드 내부에서 첫 번째 인자로 self를 받으며, 이를 통해 인스턴스 변수를 조작하거나 접근할 수 있습니다.
- 클래스의 개별 인스턴스마다 다른 동작을 하도록 구현할 수 있습니다.
예시 코드:
class Car:
def __init__(self, brand, model):
self.brand = brand # 인스턴스 변수
self.model = model
def display_info(self): # 인스턴스 메소드
return f"This car is a {self.brand} {self.model}."
# 인스턴스 생성
my_car = Car("Toyota", "Camry")
print(my_car.display_info())
This car is a Toyota Camry.
주요 특징:
- self를 통해 인스턴스 변수에 접근 가능.
- 각 인스턴스마다 다른 상태(brand, model 등)를 유지할 수 있습니다.
2. 클래스 메소드 (Class Method)
정의 및 특징
- 클래스 메소드는 클래스 자체에 속하는 메소드로, 클래스 변수를 조작하거나 클래스 전체에 적용되는 동작을 수행합니다.
- 첫 번째 인자로 cls를 받으며, 이는 클래스 자체를 가리킵니다.
- 클래스 메소드는 인스턴스가 없어도 호출할 수 있습니다.
- @classmethod 데코레이터를 사용하여 정의합니다.
예시 코드:
class Car:
car_count = 0 # 클래스 변수
def __init__(self, brand, model):
self.brand = brand
self.model = model
Car.car_count += 1 # 클래스 변수 접근
@classmethod
def get_car_count(cls): # 클래스 메소드
return f"Total cars created: {cls.car_count}"
# 인스턴스 생성
car1 = Car("Toyota", "Camry")
car2 = Car("Honda", "Accord")
# 클래스 메소드 호출
print(Car.get_car_count())
Total cars created: 2
주요 특징:
- 클래스 변수를 조작하거나 클래스의 상태에 따라 동작.
- 인스턴스 없이도 Car.get_car_count()처럼 클래스 이름으로 호출 가능.
3. 정적 메소드 (Static Method)
정의 및 특징
- 정적 메소드는 클래스나 인스턴스와 관련이 없는 독립적인 동작을 수행하는 메소드입니다.
- 클래스 내부에서 정의되지만, 클래스나 인스턴스 변수에 접근하지 않습니다.
- 일반 함수처럼 동작하지만 클래스의 네임스페이스 안에 존재합니다.
- @staticmethod 데코레이터를 사용하여 정의합니다.
예시 코드:
class Car:
@staticmethod
def car_types(): # 정적 메소드
return ["SUV", "Sedan", "Truck"]
# 정적 메소드 호출
print(Car.car_types())
['SUV', 'Sedan', 'Truck']
주요 특징:
- 클래스나 인스턴스 상태에 의존하지 않음.
- 클래스의 네임스페이스 안에서 독립적으로 동작.
4. @property 데코레이터
정의 및 특징
- 인스턴스 메소드를 속성처럼 접근할 수 있도록 만듭니다.
- @property 데코레이터를 사용하여 정의하고, @<property_name>.setter를 사용하여 값을 설정하는 메소드도 정의할 수 있습니다.
- 캡슐화된 인스턴스 변수를 읽거나 쓸 때 유용합니다.
예시 코드:
class Car:
def __init__(self, brand, model, price):
self.brand = brand
self.model = model
self._price = price # 캡슐화된 변수
@property
def price(self): # 읽기 전용 속성
return self._price
@price.setter
def price(self, new_price): # 값을 설정하는 메소드
if new_price > 0:
self._price = new_price
else:
print("Price must be positive!")
# 인스턴스 생성
my_car = Car("Toyota", "Camry", 30000)
# 읽기 및 쓰기
print(my_car.price)
my_car.price = 35000
print(my_car.price)
30000
35000
주요 특징:
- 인스턴스 변수에 직접 접근하지 않고 getter/setter를 통해 값을 읽고 쓸 수 있습니다.
- 캡슐화와 데이터 검증을 쉽게 구현할 수 있습니다.
5. 클래스에서 사용할 수 있는 메소드 비교 정리
메소드 유형 | 첫 번째 인자 | 인스턴스 접근 | 클래스 접근 | 주요 용도 |
인스턴스 메소드 | self | O | X | 인스턴스 변수를 조작하거나 인스턴스별 동작을 구현 |
클래스 메소드 | cls | X | O | 클래스 변수나 클래스 전체에 적용되는 동작 구현 |
정적 메소드 | 없음 | X | X | 클래스나 인스턴스와 관련 없는 독립적인 동작 구현 |
@property | self | O | X | 인스턴스 변수를 속성처럼 읽고 쓸 수 있게 구현 |
결론
파이썬에서 클래스 메소드는 각 메소드 유형에 따라 다르게 동작합니다. 인스턴스 메소드는 객체의 상태를 관리하고, 클래스 메소드는 클래스의 상태를 제어하며, 정적 메소드는 클래스와 독립적인 동작을 구현합니다. @property는 캡슐화된 데이터를 간단하게 다룰 수 있게 도와줍니다.
각 메소드의 특성에 맞게 사용하여 코드의 유지보수성과 확장성을 높일 수 있습니다.
Reference
https://docs.python.org/3/tutorial/classes.html
9. Classes
Classes provide a means of bundling data and functionality together. Creating a new class creates a new type of object, allowing new instances of that type to be made. Each class instance can have ...
docs.python.org