본문 바로가기
Language/Python

[Python] Staticmethod vs Classmethod | LIM

by forestlim 2022. 12. 16.
728x90
반응형

클래스에서 메서드를 생성할 때 크게 3가지로 생성할 수 있다. 

✅ 인스턴스 메서드

✅ @staticmethod (정적 메서드)

✅ @classmethod (클래스 메서드)

 

✔️ 먼저, 가장 기본인 인스턴스 메서드에 대해 알아보자

클래스 하위 메서드에 아무런 데코레이터 없이 선언한 메서드가 인스턴스 메서드이다. 첫 번째 매개변수로 클래스의 인스턴스가 넘어오게 되고, 그 이름을 self라고 한다. 즉 self는 클래스를 가리킨다고 생각하면 된다. 

인스턴스 메서드는 이 self 를 통해 인스턴스 속성(attribute)에 접근하거나 다른 인스턴스 메서드를 호출할 수 있다. 

뿐만 아니라 self 를 통해 클래스 속성에 접근하거나 클래스 메서드를 호출할 수도 있다. 

 

class Company:
    ceo = 'Ruby'

    def __init__(self, name, address):
        self.name = name
        self.address = address

    def print_ceo_name(self):
        print(self.ceo)

    def change_ceo_name(self):
        self.ceo = self.name
        print(self.ceo)


if __name__ == '__main__':
    market = Company(name='Hwalim', address='Seoul')
    market.print_ceo_name()
    market.change_ceo_name()
    
    
>> Ruby
>> Hwalim

 

✔️ 클래스 메서드

@classmethod 데코레이터를 이용하여 클래스에 메서드를 선언하면 해당 메서드는 클래스 메서드가 된다. 인스턴스 메서드와 달리 첫 번째 매개변수로 클래스 인스턴스가 아닌 클래스 자체가 넘어오게 된다.  인스턴스를 가리키는 self 가 아닌 클래스를 의미하는 cls 로 적어준다.  cls를 통해 클래스 속성에 접근하고 클래스 메서드를 호출할 수 있다. 그러나 인스턴스 속성에 접근하는 거나 인스턴스 메서드를 호출하는 건 불가능하다. 

 

파이썬에서는 생성자 오버로딩을 지원하기 때문에, 클래스 메서드는 특히 팩토리 메서드를 작성할 때 유용하게 사용된다. 

🧐 팩토리 메소드 패턴
- 생성 패턴 중 하나로 객체를 생성할 때 어떤 클래스의 인스턴스를 만들지 서브 클래스에서 결정하게 되는 것
- 추상 클래스와 관련이 있다. 

 

class Company:
    ceo = 'Ruby'

    def __init__(self, name, address):
        self.name = name
        self.address = address

    @classmethod
    def print_ceo_name(cls):
        print(cls.ceo)

    @classmethod
    def change_ceo_name(cls):
        Company.ceo = 'Hwalim'
        print(Company.ceo)


if __name__ == '__main__':
    market = Company(name='Hwalim', address='Seoul')
    market.print_ceo_name()
    market.change_ceo_name()
    

>> Ruby
>> Hwalim

 

✔️ 마지막으로 정적(static) 메서드

정적 메서드는 유틸리티 클래스를 구현할 때 많이 사용된다고 한다. 

비슷한 류의 여러 메서드를 하나의 클래스에 묶어두고 싶을 때 많이 사용한다. 굳이 인스턴스나 클래스의 속성 값을 초기화할 필요가 없을 경우에 사용하면 좋을 것 같다. 즉, 클래스 속성이나 인스턴스 접근이 필요할 때는 클래스 메서드, 접근이 굳이 필요 없을 때는 정적 메서드를 사용하면 된다.

 

또한, 따로 클래스의 인스턴스를 생성하지 않고 바로 클래스를 통해서 메서드를 호출할 수 있다는 장점이 있다. 

그러나 파이썬에서 staticmethod를 굳이 왜 써야 하는 지에 대해 의문을 가지고 있는 사람도 있다. 사실 staticmethod는 모듈 대신 클래스 본체 안에 정의된 평범한 함수일 뿐이라고 생각한다. 

 

🧐 유틸리티 클래스
- 인스턴스 메서드와 인스턴스 변수를 일절 제공하지 않고, 정적 메서드와 변수만을 제공하는 클래스를 뜻한다.
- 클래스 본래의 목적인 '데이터와 데이터 처리를 위한 로직의 캡슐화' 를 실행하는 것이 아닌, '비슷한 기능의 메서드와 상수를 모아서 캡슐화' 한 것이 유틸리티 클래스이다. 

 

class Calculator:

    @staticmethod
    def add(a, b):
        return a + b

    @staticmethod
    def minus(a, b):
        return a - b


if __name__ == '__main__':
    print(Calculator.add(5, 3))   # 8
    print(Calculator.minus(5, 3)) # 2

 

728x90
반응형

댓글