Python

[Python] 파이썬 클래스 데코레이터: @classmethod와 @staticmethod

하방주인장 2024. 5. 15. 09:39

목차

     

    파이썬 클래스 데코레이터: @classmethod와 @staticmethod

     

    파이썬의 클래스 데코레이터는 클래스나 메소드의 동작을 변경하거나 확장할 수 있는 강력한 기능을 제공한다. 이번 포스팅에서는 특히 `@classmethod`와 `@staticmethod` 데코레이터에 대해 알아보자.

     

    1. @classmethod

    `@classmethod` 데코레이터는 클래스 메소드를 정의하는 데 사용된다. 클래스 메소드는 인스턴스 메소드와는 달리 클래스 자체에 바인딩된다. 이는 클래스 메소드가 클래스 상태에 접근하고 이를 수정할 수 있음을 의미한다. 클래스 메소드는 첫 번째 인자로 클래스를 받기 때문에, 클래스의 속성을 변경하거나 클래스의 메소드에 접근할 수 있다.

     

    # 예시
    
    class MyClass:
        count = 0
    
        @classmethod
        def increment(cls):
            cls.count += 1
            
    MyClass.increment() 
    print(MyClass.count) # Output: 1

    위의 예제에서 increment 메소드는 @classmethod 데코레이터를 사용하여 정의되었다. 메소드는 클래스 변수 count 증가시킨다.

     

    클래스 메소드의 특징

    • 클래스 메소드는 첫 번째 인자로 클래스 자체를 받는다. 관례적으로 cls라고 부른다.
    • 클래스 상태를 변경할 수 있으며, 이는 클래스의 모든 인스턴스에 영향을 미친다.
    • 클래스 이름을 통해 직접 호출할 있다.

     

    2. @staticmethod

    @staticmethod 데코레이터는 클래스 인스턴스 없이 호출할 있는 메소드를 정의한다. 스태틱 메소드는 클래스나 인스턴스 상태에 접근할 없으며, 일반 함수처럼 동작한다. 주로 클래스와 관련 있지만, 클래스나 인스턴스 상태에 의존하지 않는 기능을 구현할 사용된다.

     

    class MyClass: 
    
    	@staticmethod 
        def my_method(x, y): 
        	return x + y 
            
    result = MyClass.my_method(5, 3) 
    print(result) # Output: 8
    
    result = MyClass.my_method(10, 20) 
    print(result) # Output: 30

    위의 예제에서 my_method는 @staticmethod 데코레이터를 사용하여 정의되었다. 이 메소드는 단순히 두 숫자의 합을 반환한다.

     

    스태틱 메소드의 특징

    • 클래스나 인스턴스 상태에 접근할 수 없다.
    • 클래스 인스턴스를 생성하지 않고도 호출할 수 있다.
    • 클래스 이름을 통해 직접 호출할 있다.

     

    3. 인스턴스 메소드와의 차이

    인스턴스 메소드는 번째 인자로 인스턴스를 받는다. 관례적으로 self라고 부른다. 이는 인스턴스 상태에 접근하고 이를 수정할 있음을 의미한다.

    class MyClass: 
    	def my_method(self, x, y): 
        	return x + y 
            
    my_instance = MyClass() 
    result = my_instance.my_method(5, 3) 
    print(result) # Output: 8

     

    4. 추가: 프라이빗 메소드

    파이썬에서는 언더스코어(_) 시작하는 메소드는 프라이빗 메소드로 간주된다. 이는 해당 메소드가 클래스 외부에서 사용되지 않도록 의도되었음을 나타낸다.

    class MyClass: 
    	def _run(self): 
        	print("Running") 
    
    my_instance = MyClass() 
    my_instance._run() 
    # Output: Running

     

    다른 언어에서는 프라이빗 메소드가 클래스 외부에서 접근되지 않도록 강제하지만, 파이썬은 그렇지 않다. 이는 개발자 간의 암묵적인 규칙으로 이해하면 된다.

     

    이와 같이 @classmethod @staticmethod 데코레이터를 적절히 사용하면, 코드의 가독성을 높이고 유지보수를 쉽게 있다.