35.2 정적 메서드 사용하기
지금까지 클래스의 메서드를 사용할 때 인스턴스를 통해서 호출했습니다. 이번에는 인스턴스를 통하지 않고 클래스에서 바로 호출할 수 있는 정적 메서드와 클래스 메서드에 대해 알아보겠습니다.
먼저 정적 메서드입니다. 정적 메서드는 다음과 같이 메서드 위에 @staticmethod를 붙입니다. 이때 정적 메서드는 매개변수에 self를 지정하지 않습니다.
class 클래스이름: @staticmethod def 메서드(매개변수1, 매개변수2): 코드
@staticmethod처럼 앞에 @이 붙은 것을 데코레이터라고 하며 메서드(함수)에 추가 기능을 구현할 때 사용합니다. 데코레이터는 'Unit 42 데코레이터 사용하기'에서 자세히 설명하겠습니다.
그럼 간단하게 덧셈과 곱셈을 하는 클래스를 만들어보겠습니다.
class_static_method.py
class Calc: @staticmethod def add(a, b): print(a + b) @staticmethod def mul(a, b): print(a * b) Calc.add(10, 20) # 클래스에서 바로 메서드 호출 Calc.mul(10, 20) # 클래스에서 바로 메서드 호출
실행 결과
30 200
Calc 클래스에서 @staticmethod를 붙여서 add 메서드와 mul 메서드를 만들었습니다. 정적 메서드를 호출할 때는 다음과 같이 클래스에서 바로 메서드를 호출하면 됩니다.
- 클래스.메서드()
Calc.add(10, 20) # 클래스에서 바로 메서드 호출 Calc.mul(10, 20) # 클래스에서 바로 메서드 호출
정적 메서드는 self를 받지 않으므로 인스턴스 속성에는 접근할 수 없습니다. 그래서 보통 정적 메서드는 인스턴스 속성, 인스턴스 메서드가 필요 없을 때 사용합니다.
여기서 만든 Calc 클래스에 들어있는 add, mul 메서드는 숫자 두개를 받아서 더하거나 곱할 뿐 인스턴스의 속성은 필요하지 않습니다.
그럼 무엇을 정적 메서드로 만들어야 할까요? 정적 메서드는 메서드의 실행이 외부 상태에 영향을 끼치지 않는 순수 함수(pure function)를 만들 때 사용합니다. 순수 함수는 부수 효과(side effect)가 없고 입력 값이 같으면 언제나 같은 출력 값을 반환합니다. 즉, 정적 메서드는 인스턴스의 상태를 변화시키지 않는 메서드를 만들 때 사용합니다.
파이썬의 자료형도 인스턴스 메서드와 정적, 클래스 메서드로 나뉘어져 있습니다. 예를 들어 세트에 요소를 더할 때는 인스턴스 메서드를 사용하고, 합집합을 구할 때는 정적 메서드를 사용하도록 만들어져 있습니다.
>>> a = {1, 2, 3, 4} >>> a.update({5}) # 인스턴스 메서드 >>> a {1, 2, 3, 4, 5} >>> set.union({1, 2, 3, 4}, {5}) # 정적(클래스) 메서드 {1, 2, 3, 4, 5}
이처럼 인스턴스의 내용을 변경해야 할 때는 update와 같이 인스턴스 메서드로 작성하면 되고, 인스턴스 내용과는 상관없이 결과만 구하면 될 때는 set.union과 같이 정적 메서드로 작성하면 됩니다.