python

[파이썬 / python] 클래스 메서드(Class Method)와 스태틱 메서드(Static Method)

카방찐 2025. 1. 24. 19:33

클래스 메서드와 스태틱 메서드는 언제 어떻게 활용하는 것일까?

 

다음의 예시를 보며 이해해 보자

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를 받지 않는다.
  • 클래스나 인스턴스 속성에 직접 접근할 수 없다.
  • 로직 자체는 일반 함수와 다를 바 없지만, 해당 함수가 클래스와 밀접한 관련이 있거나
    "논리적으로" 클래스 내부에 두는 것이 더 이해하기 좋을 때 사용한다.
  • 예시: 단순 계산, 포매팅, 검증 로직 등에서 활용.

 

 

이렇게 메서드를 적절히 구분해 두면,

인스턴스마다 다른 속성에 접근해야 하면 인스턴스 메서드를,

클래스 전역(예: 전체 인스턴스 수 관리) 로직이나 클래스 자체를 통해 인스턴스를 만들 경우 클래스 메서드를,

클래스나 인스턴스 속성과 무관하게 단순 기능만 제공할 때 스태틱 메서드
사용하는 식으로 명확히 역할을 구분할 수 있다.