클래스 메서드와 스태틱 메서드는 언제 어떻게 활용하는 것일까?
다음의 예시를 보며 이해해 보자
class Car:
# 클래스 속성(클래스 변수)
total_cars = 0
def __init__(self, brand, model, year):
# 인스턴스 속성(인스턴스마다 별도로 존재)
self.brand = brand
self.model = model
self.year = year
# 인스턴스를 만들 때마다 클래스 속성을 변경(전체 생산된 차량 수)
Car.total_cars += 1
def get_car_info(self):
"""
인스턴스 메서드 예시.
첫 번째 인자로 self를 받으며,
인스턴스 속성에 직접 접근할 수 있다.
"""
return f"{self.brand} {self.model} ({self.year}년식)"
@classmethod
def get_total_cars(cls):
"""
클래스 메서드 예시.
첫 번째 인자로 cls를 받으며,
클래스 속성이나 다른 클래스 메서드에 접근할 수 있다.
"""
return cls.total_cars
@classmethod
def from_string(cls, car_string):
"""
클래스 메서드 예시.
문자열을 받아서 brand, model, year 정보를 파싱한 뒤
cls(즉 Car 클래스)의 인스턴스를 생성해 반환한다.
"""
brand, model, year = car_string.split(',')
return cls(brand.strip(), model.strip(), int(year.strip()))
@staticmethod
def calculate_age(year):
"""
스태틱 메서드 예시.
인자를 받아서 단순 계산을 수행한다.
첫 번째 인자로 self나 cls를 받지 않으므로
클래스 속성이나 인스턴스 속성에 직접 접근할 수 없다.
"""
import datetime
current_year = datetime.datetime.now().year
return current_year - year
if __name__ == "__main__":
# 인스턴스 생성
car1 = Car("Toyota", "Camry", 2015)
car2 = Car("Hyundai", "Sonata", 2020)
# (1) 인스턴스 메서드 사용 예시
print(car1.get_car_info()) # "Toyota Camry (2015년식)" 출력
print(car2.get_car_info()) # "Hyundai Sonata (2020년식)" 출력
# (2) 클래스 메서드 사용 예시
print(Car.get_total_cars()) # 현재까지 생성된 Car 인스턴스 수(2) 출력
# 클래스 메서드를 통한 인스턴스 생성 예시
car3 = Car.from_string("Kia, K5, 2022")
print(car3.get_car_info()) # "Kia K5 (2022년식)" 출력
print(Car.get_total_cars()) # 새 인스턴스가 생성되어 3 출력
# (3) 스태틱 메서드 사용 예시
age_of_car1 = Car.calculate_age(car1.year)
print(f"car1의 현재 연식: {age_of_car1}년")
클래스 메서드 (Class Method)
- 첫 번째 인자로 cls를 받는다.
- 클래스 속성(cls.total_cars)에 접근하거나 수정할 수 있다.
- 새로운 인스턴스를 생성해 반환하거나, 클래스 수준에서 공통으로 관리되는 데이터를 활용(인스턴스 수 관리 등)할 때 유용하다.
- 예시: 문자열이나 딕셔너리 같은 특별한 형태의 데이터를 받아 인스턴스를 생성하는 팩토리(factory) 메서드 역할(ex. from_string method)
- 기존에 Car instance를 생성할 때 year에 int가 들어가게 설계되었지만 from_string class method를 통해 year에 string이 들어와도 Car instance가 생성된다.
스태틱 메서드 (Static Method)
- 첫 번째 인자로 self나 cls를 받지 않는다.
- 클래스나 인스턴스 속성에 직접 접근할 수 없다.
- 로직 자체는 일반 함수와 다를 바 없지만, 해당 함수가 클래스와 밀접한 관련이 있거나
"논리적으로" 클래스 내부에 두는 것이 더 이해하기 좋을 때 사용한다. - 예시: 단순 계산, 포매팅, 검증 로직 등에서 활용.
이렇게 메서드를 적절히 구분해 두면,
인스턴스마다 다른 속성에 접근해야 하면 인스턴스 메서드를,
클래스 전역(예: 전체 인스턴스 수 관리) 로직이나 클래스 자체를 통해 인스턴스를 만들 경우 클래스 메서드를,
클래스나 인스턴스 속성과 무관하게 단순 기능만 제공할 때 스태틱 메서드를
사용하는 식으로 명확히 역할을 구분할 수 있다.
'python' 카테고리의 다른 글
| [파이썬 / python] PEP 8 - 코드를 읽기 쉽게 작성해보자 (0) | 2025.01.23 |
|---|---|
| [파이썬 / Python] 클래스(Class)와 객체(Object) (0) | 2025.01.23 |
| [파이썬 / python] 객체 지향 프로그래밍(Object Oriented Programming) (0) | 2024.09.29 |
| [파이썬 / python] 연산자 - 식별 연산자 (is, is not) (0) | 2024.09.22 |
| [파이썬 / python] 연산자 - 멤버쉽 연산자 (in, not in) (0) | 2024.09.20 |