IT/언어

[python] 클래스 메소드(@classmethod)와 스태틱 메소드(@staticmethod)

개발자 두더지 2021. 9. 8. 23:36
728x90

classmethod와 staticmethod란


classmethod

클래스 메소드는 아래와 같이 @classmethod를 클래스 함수에 붙이는 문법으로 사용할 뿐이다. 첫 번째 인수로 일반적으로 사용하는 self가 아닌, cls를 사용한다.

class MyClass:
    CLASS_PARAM = 100

    def __init__(self, instance_param):
        self.instance_param = instance_param

    @classmethod
    def method(cls):
        print(cls.CLASS_PARAM)
        # print(cls.instance_param)는 불가능하다.

함수 안에서는 인스턴스 변수로의 액세스는 안되지만, 클래스 변수에 액세스하는 것은 가능하다. 또한, 다른 클래스 메소드나 스태틱 메소드에도 액세스 가능하다.
필요로하는 인스턴수 변수가 없을 경우 사용한다. 그러므로 클래스 변수에 액세스해야할 때나, 상속 클래스 동작을 바꿔야할 경우에는 classmethod를 사용하자.

staticmethod

인스턴스 메소드나 클래스 메소드와 달리, 지정된 첫 번째 인수가 없고, 필요한 인수를 첫 번째부터 쓴다.

class MyClass:
    CLASS_PARAM = 100

    def __init__(self, instance_param):
        self.instance_param = instance_param

    @classmethod
    def method(cls):
        print(cls.CLASS_PARAM)
        # print(cls.instance_param) 는 불가능하다.

    @staticmethod
    def method_2(param):
        print("Static!!", param)
        # cls.method() 불가능하다.
        # print(cls.CLASS_PARAM) 불가능하다.
        # print(self.instance_param) 불가능하다.

함수 내에서는 인스턴스 변수나 클래스 변수, 다른 함수에도 액세스 할 수 없다. 클래스 내 다른 구현에 의존하지 않는 함수이다.
필요로 하는 독립된 함수로써 구현하는 경우에 사용할 수 있다. 그러므로 상속 클래스에도 동작을 바꾸지 않을 경우에 사용하자.

구분 사용의 장점


구분해서 사용함에 있어서의 장점은 아래의 세 가지이다.
- 가독성, 보수성
- 인스턴스화의 수고가 감소
- 퍼포먼스

가독성, 보수성

첫 번째 인수가 self이거나 cls이거나 해서 오히려 가독성이 떨어진다는 의견이 있을 수 있다. 그러나 다른 사람의 코드를 읽을 때, 인스턴스 변수가 얽혀있는 함수는 읽기 힘든 경향이 있다. 특히 다른 함수에서 조작되고 있는 인스턴스 변수가 더욱이 다른 함수에서 등장하는 다양한 케이스는 더더욱 파악하기 힘들다. 따라서 명시적으로 표현함으로써 가독성을 올리고, 가독성이 높은 코드는 자연스럽게 보수하기 쉬워진다.

인스턴스화의 수고가 감소

인스턴스 메소드를 사용할 때 한 번 인스턴스화하지 않으면 안 되지만, 클래스 메소드나 스태틱 메소드인 경우, 그러한 과정이 필요없어진다.

# 인스턴스 메소드로 구현되어 있는 경우
object = MyClass()
object.method()

# 클래스 메소드로 구현되어 있는 경우
MyClass.method()

퍼포먼스

매번 인스턴스화하지 않는다는 것은 처리도 감소하는 것을 의미하다. 무의미한 인스턴스로 메모리를 사용하지 않게 되므로 부담이 줄어든다.


참고자료
https://it-for-pharma.com/python-classmethod%E3%81%A8staticmethod%E3%82%92%E4%BD%BF%E3%81%86%E6%84%8F%E5%91%B3%E3%82%92%E8%80%83%E3%81%88%E3%82%8B
https://qiita.com/msrks/items/fdc9afd12effc2cba1bc
https://blog.pyq.jp/entry/Python_kaiketsu_190205

728x90