2023-01-28 22:56:04

클래스 속성(class attribute)

파이썬에서 클래스를 정의할 때 메서드 밖에 존재하는 변수(속성)을 클래스 변수(속성)이라고 합니다.

 

class Person:
    person_cnt = 0 # 클래스 변수

    def __init__(self, name, age):
        self.name = name # 인스턴스 변수
        self.age = age # 인스턴스 변수
        Person.person_cnt += 1
        print(f"현재까지 {Person.person_cnt}명 생성됨.")


person1 = Person("홍길동", 35)
person2 = Person("변사또", 48)

print(person1.person_cnt)
print(person2.person_cnt)
print(Person.person_cnt)

 

 

위 코드에서는 person_cnt가 클래스 속성입니다. 클래스 안에서 클래스 속성에 접근하려면 "클래스명.변수명"으로 접근할 수 있습니다. 클래스 밖에서 클래스 속성에 접근하려면 "클래스명.변수명" 또는 "인스턴스명.변수명"으로 접근할 수 있습니다. 인스턴스마다 독립적인 값을 갖지 않고 같은 값을 공유한다는 것을 알 수 있습니다. 

 

클래스 메서드

클래스 속성은 클래스 메서드와 많은 경우에 함께 사용됩니다. 클래스 내 메서드 중에서 @classmethod 데코레이터가 붙은 메서드들이 클래스 메서드입니다. 클래스 속성을 조작하거나, 팩토리 메서드를 작성할 때 유용하게 사용됩니다. 팩토리 메서드라는 것은 팩토리(공장)이라는 용어와 같이 객체를 생산하는 기능을 수행하는 메서드입니다. 클래스 메서드의 첫 매개변수로는 항상 cls가 전달되어야 합니다. 

 

from datetime import datetime

class Person:
    person_cnt = 0 # 클래스 변수

    def __init__(self, name, age):
        self.name = name # 인스턴스 변수
        self.age = age # 인스턴스 변수
        Person.add_person_cnt()
        
    @classmethod
    def print_person_cnt(cls):
        print(f"현재까지 {Person.person_cnt}명 생성됨.")

    @classmethod
    def add_person_cnt(cls):
        cls.person_cnt += 1

    @classmethod 
    def from_year(cls, name, year): # 팩토리 메서드용 classmethod
        return cls(name, datetime.now().year - year + 1)


person1 = Person("홍길동", 35)
person2 = Person("변사또", 48)
person3 = Person.from_year("이몽룡", 1984)

 

 

보시면 총 3개의 클래스 메서드가 정의되었는데, 그 중 위에 있는 2개는 클래스 속성을 조작하기 위한 용도이고, 마지막 하나는 팩토리 메서드용입니다. 원래는 이름과 나이를 매개변수로 전달해줘야 객체가 생성되는데, from_year() 클래스 메서드 덕분에 나이 대신에 출생연도를 전달해줘도 나이로 변환되어 제대로 객체가 생성됩니다. 

 

관련 글

- [python] 정적  메서드(static method)는 주로 어떤 경우에 사용되는가