본문 바로가기

Study/python

[python] @staticmethod 와 @classmethod 정리(feat.ChatGPT)

728x90
반응형

Python에서는 @classmethod 및 @staticmethod 데코레이터를 사용하여 클래스의 인스턴스가 아닌 클래스에 바인딩된 메서드를 정의할 수 있다.

 

  1. 코드 구성: @classmethod 및 @staticmethod 사용의 이점 중 하나는 클래스 내에서 코드를 구성하는 데 도움이 된다. 인스턴스 수준 메서드에서 클래스 수준 메서드를 분리하면 코드를 더 읽기 쉽고 이해하기 쉽게 만들 수 있다.
  2. 코드 재사용: 또 다른 이점은 클래스 메서드와 정적 메서드를 동일한 클래스의 다른 인스턴스나 다른 클래스에서 재사용할 수 있다는 것이다. 이는 코드 중복을 줄이고 코드 유지 관리성을 향상시키는 데 도움이 된다.
  3. 클래스 수준 데이터 액세스: 클래스 메서드는 클래스의 모든 인스턴스에서 공유하는 데이터인 클래스 수준 데이터에 액세스하고 수정할 수 있다. 이는 특정 인스턴스가 아닌 클래스 전체와 관련된 일부 정보를 추적하려는 경우에 유용할 수 있다고 한다.
  4. 유틸리티 함수 제공: 정적 메서드는 클래스와 관련된 유틸리티 함수를 정의하는 데 사용할 수 있지만 클래스의 특정 인스턴스에 의존하지 않는다. 이렇게 하면 코드를 체계적으로 유지하고 가독성을 높일 수 있다.



@classmethod

@classmethod로 장식된 메서드를 클래스 메서드라고 합니다. 클래스 메서드는 클래스 자체를 인스턴스 대신 일반적으로 "cls"라는 첫 번째 인수로 사용합니다. 이를 통해 클래스 메서드는 클래스 수준 데이터에 액세스하거나 클래스의 모든 인스턴스에서 공유하는 새 클래스 수준 개체를 만들 수 있습니다.

예를 들어 Person이라는 클래스가 있고 이 클래스를 사용하여 생성된 사람의 수를 추적하려고 한다고 가정해 보겠습니다. @classmethod를 사용하여 클래스 수준 변수 개수를 만들 수 있으며 새 사람이 생성될 때마다 개수를 업데이트할 수 있습니다.

class Person:
    count = 0

    def __init__(self, name):
        self.name = name
        Person.count += 1

    @classmethod
    def get_count(cls):
        return cls.count

위의 코드에서 @classmethod를 사용하여 현재 생성된 사람 수를 반환하는 get_count()라는 메서드를 정의합니다. get_count()는 클래스 메서드이므로 클래스의 인스턴스가 아닌 클래스 이름을 사용하여 호출할 수 있습니다.

 

@staticmethod

@staticmethod로 장식된 메서드를 정적 메서드라고 합니다. 클래스 메서드와 달리 정적 메서드는 특별한 첫 번째 인수를 사용하지 않습니다. 이들은 클래스 외부에서 정의된 일반 함수와 유사하지만 구성 목적을 위해 클래스 내부에서 정의됩니다.

예를 들어 두 개의 숫자를 입력받아 더 큰 숫자를 반환하는 함수를 정의하고 싶다고 가정해 보겠습니다. @staticmethod를 사용하여 클래스 내에서 정의되지만 클래스 수준 데이터에 의존하지 않는 함수를 만들 수 있습니다.

class Math:
    @staticmethod
    def find_max(x, y):
        if x > y:
            return x
        else:
            return y

 

위의 코드에서 우리는 @staticmethod를 사용하여 find_max()라는 메서드를 정의합니다. 이 메서드는 x와 y 두 개의 숫자를 입력받아 더 큰 값을 반환합니다. find_max()는 정적 메서드이므로 클래스의 인스턴스가 아닌 클래스 이름을 사용하여 호출할 수 있습니다.

요약하면 @classmethod와 @staticmethod는 Python 클래스에서 클래스의 인스턴스가 아닌 클래스에 바인딩된 메서드를 정의하는 데 사용되는 두 개의 데코레이터입니다. 클래스 메서드는 클래스 자체를 첫 번째 인수로 사용하는 반면 정적 메서드는 특별한 첫 번째 인수를 사용하지 않습니다. 이러한 데코레이터는 코드를 구성하고 코드 재사용을 개선하며 클래스 수준 데이터 및 유틸리티 기능에 액세스하는 데 도움이 될 수 있습니다.

 

 

728x90
반응형