[Python] 파이썬 클래스 데코레이터: @classmethod와 @staticmethod
목차
파이썬 클래스 데코레이터: @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 데코레이터를 적절히 사용하면, 코드의 가독성을 높이고 유지보수를 쉽게 할 수 있다.