37.3 클래스 메서드 사용하기

이번에는 정적 메서드와 비슷하지만 약간의 차이점이 있는 클래스 메서드를 사용해보겠습니다.

클래스 메서드는 다음과 같이 메서드 위에 @classmethod를 붙입니다. 이때 클래스 메서드는 첫 번째 매개변수에 cls를 지정해야 합니다(clsclass에서 따왔습니다).

class 클래스이름:
    @classmethod
    def 메서드(cls, 매개변수1, 매개변수2):
        코드

그럼 사람 클래스 Person을 만들고 인스턴스가 몇 개 만들어졌는지 출력하는 메서드를 만들어보겠습니다.

class_class_method.py

class Person:
    count = 0    # 클래스 속성
 
    def __init__(self):
        Person.count += 1    # 인스턴스가 만들어질 때
                             # 클래스 속성 count에 1을 더함
 
    @classmethod
    def print_count(cls):
        print('{0}명 생성되었습니다.'.format(cls.count))    # cls로 클래스 속성에 접근
 
james = Person()
maria = Person()
 
Person.print_count()    # 2명 생성되었습니다.
2 생성되었습니다.

먼저 인스턴스가 만들어질 때마다 숫자를 세야 하므로 __init__ 메서드에서 클래스 속성 count에 1을 더해줍니다. 물론 클래스 속성에 접근한다는 것을 명확하게 하기 위해 Person.count와 같이 만들어줍니다.

class Person:
    count = 0    # 클래스 속성
 
    def __init__(self):
        Person.count+= 1     # 인스턴스가 만들어질 때
                             # 클래스 속성 count에 1을 더함

이제 @classmethod를 붙여서 클래스 메서드를 만듭니다. 클래스 메서드는 첫 번째 매개변수가 cls인데 여기에는 현재 클래스가 들어옵니다. 따라서 cls.count처럼 cls로 클래스 속성 count에 접근할 수 있습니다.

    @classmethod
    def print_count(cls):
        print('{0}명 생성되었습니다.'.format(cls.count))    # cls로 클래스 속성에 접근

Person으로 인스턴스를 두 개 만들었으므로 print_count를 호출해보면 '2명 생성되었습니다.'가 출력됩니다. 물론 print_count는 클래스 메서드이므로 Person.print_count()처럼 클래스로 호출해줍니다.

james = Person()
maria = Person()
 
Person.print_count()    # 2명 생성되었습니다.

클래스 메서드는 정적 메서드처럼 인스턴스가 없어도 될 때 사용한다는 점은 같습니다. 하지만 클래스 메서드는 메서드 안에서 클래스 속성, 클래스 메서드에 접근해야 할 때 사용합니다.

물론 정적 메서드에서도 다음과 같이 클래스 이름을 통해서 클래스 속성에 접근할 수 있습니다.

    @staticmethod
    def print_count():
        print('{0}명 생성되었습니다.'.format(Person.count))

하지만 클래스 메서드를 사용하면 클래스를 cls로 클래스 속성(메서드)에 바로 접근할 수 있으므로 코드가 좀더 명확해집니다.

    @classmethod
    def print_count(cls):
        print('{0}명 생성되었습니다.'.format(cls.count))

특히 cls를 사용하면 메서드 안에서 현재 클래스의 인스턴스를 만들 수도 있습니다. 즉, cls는 클래스이므로 cls()Person()과 같습니다.

    @classmethod
    def create(cls):
        p = cls()    # cls()로 인스턴스 생성
        return p
참고 | 파이썬 자료형의 인스턴스 메서드와 정적(클래스) 메서드

파이썬의 자료형도 인스턴스 메서드와 정적(클래스) 메서드로 나뉘어져 있습니다. 예를 들어 세트에 요소를 더할 때는 인스턴스 메서드를 사용하고, 합집합을 구할 때는 정적(클래스) 메서드를 사용하도록 만들어져 있습니다.

>>> 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과 같이 정적(클래스) 메서드로 작성하면 됩니다.