정적 메서드란 무엇인가? 자바를 사용해본 경험이 있다면 정적 메서드가 무슨 의미인지 알 것이다.

 

정적 메서드를 static method 라고 한다.

 

파이썬 말고도 C나 자바에서 static이라는 이름으로 사용하는 문법이 많기 때문에 오히려 그 언어를 사용해봤다면 개념잡기가 쉽지 않을 수도 있다.

 

아래 자바의 포스팅에서 조금 더 개념을 설명해놨다. 궁굼하면 참고할 수 있다.

 

 

자바 튜토리얼 (5-8) static 변수/메서드

자바의 static 키워드에 대해서 알아보자. 흔한 단어는 아닌 것 같은데, static은 무슨 뜻인가? static 의 dictionary.com 의 정의는 아래와 같다. 1. pertaining to or characterized by a fixed or stationary c..

digiconfactory.tistory.com

일단 정적 메소드나 클래스 메서드의 공통점은 인스턴스의 생성없이 사용가능하다는 점이다.

 

*정적 메서드의 사용법은 아래와 같다.

class MyMath:
    @staticmethod
    def square(x):
        return (x*x)

number = MyMath.square(3)
print(number)

math1 = MyMath()
number = math1.square(4)
print(number)

메서드의 바로 위에 @staticmethod 표시를 한다. @가 붙은 것은 데코레이터라고 하며 메소드에 기능을 추가시킬 수 있다.

 

예제를 보면 인스턴스 없이 클래스 이름 MyMath를 그대로 사용한다. 그 아래는 인스턴스를 만들어서 사용한다. 인스턴스가 있으나 없으나 사용가능한 것이 정적 메서드 (static method)이다.

 

정적 메서드는 다른 메서드와 달리 self 매개변수를 를 받지 않는다. 보통 클래스의 메서드는 항상 self 를 받는다. self 가 곧 인스턴스를 의미하는 것을 생각하면 인스턴스가 필요없는 정적 메서드에서 self를 받지 않는 것은 당연하다.

 

self를 받지 않으면 당연히 내부 속성(변수)에도 접근히 불가능하다. 파이썬은 타언어에 비교해서 문법의 유연성을 위해 많은 부분이 생략되있는데 유독 클래스의 self를 명시하는 것이 특징이라 할 수 있다. 자바의 this 같은 문법인데 자바의 메서드에서는 매개변수로 명시하지 않는다. 그냥 this로 사용할 뿐이다.

 

self 를 사용하고 싶으면 이렇게 해야한다. self는 자기자신의 인스턴스이다. 인스턴스에는 a 속성이 포함되는데 self.a 형식으로 값에 접근할 수 있다.

 

 

* 클래스 메서드 사용하기 (class method)

 

클래스 메서드의 경우 정적 메서드처럼 인스턴스 없이 사용가능하다. 그런데 한가지 기능이 더 추가되었다. 클래스의 속성에 접근이 가능하다.

 

class Animal:
    count = 0

    def add_cow(self):
        Animal.count += 1
        print("Cow added!")
        
    @classmethod
    def animal_count(cls):
        print("Animal counter : ", cls.count)

ani1 = Animal()
ani2 = Animal()
ani1.add_cow()
ani2.add_cow()
ani2.add_cow()

Animal.animal_count()

Animal 클래스에서 count 라는 클래스 속성을 만들고 초기화한다.

 

이 속성을 다루는 방법은 클래스 메서드의 cls 와 Animal 클래스를 직접 사용하는 것이다. 클래스 메서드에서는 매개변수 cls 를 받는다. 이 매개변수를 통해서 Animal.count 에 접근이 가능하다.

 

주의할 점은 Animal.count와 self.count가 다르다는 것이다. 잘못하다간 혼동할 여지가 많다.

class Animal:
    count = 0

    def hello(self):
        self.count = 99
        print(self.count)
        print(Animal.count)

예를 들어 위의 코드를 보면 self 가 가리키는 것은 함수 내부의 self.count 이고 Animal.count는 바깥의 count를 가리킨다. 클래스 메소드에서는 cls.count 이다.

 

정적 메서드나 클래스 메서드는 프로그램 전체 영역에서 접근 가능한 만큼 예전 전역변수들과 비슷한 특성을 가지고 있다. 그러다 보니 남발하는 것은 권장하지 않는다.

 

자바는 정적 메서드와 클래스 메서드가 동일한데 비하여 파이썬은 두개를 나눈다. 

 

파이썬만의 특징이니 주의하도록 한다.

 

 

공유하기

facebook twitter kakaoTalk kakaostory naver band