[python] 클래스 속성과 정적, 클래스 메소드 사용하기

클래스 속성과 인스턴스 속성 알아보기

# 앞서 클래스의 속성을 사용해봤는데,
# 속성에는 클래스 속성과 인스턴스 속성 두 가지 종류가 있다.
# __init__ 메소드에서 만들었던 속성은 인스턴스 속성이다.
# 이번에는 클래스 속성을 사용해보자.
# class 클래스이름:
#     속성 = 값
# 과 같이 클래스 속성을 만들 수 있다.
class Person:
    bag = []

    def put_bag(self, stuff):
        Person.bag.append(stuff)
        # self.bag.append(stuff)  이렇게 두 가지 방식으로 접근이 가능한데, 위의 방식이 좀 더 직관적이다.


james = Person()
james.put_bag('book')

maria = Person()
maria.put_bag('key')

print(james.bag)  # ['책', '열쇠']
print(maria.bag)  # ['책', '열쇠']
# Person 클래스로 인스턴스를 각각 만들어줬음에도 불구하고
# james와 maria의 bag에는 같은 요소가 들어가있다.
# 즉, 클래스 속성은 클래스에 속해 있으며 해당 클래스의 인스턴스 모두가 공유한다.
# 또한, 클래스 속성도 인스턴스 속성과 마찬가지로 이름 앞에 __ 를 붙이면 비공개 속성으로 만들 수 있다.


# 클래스와 메소드의 독스트링은 아래와 같은 방식으로 사용할 수 있다.
class Person2:
    '''사람 클래스'''

    def greeting(self):
        '''인사 메소드'''
        print('Hello')


print(Person2.__doc__)  # 사람 클래스
print(Person2.greeting.__doc__)  # 인사 메소드

maria = Person2()
print(maria.greeting.__doc__)  # 인사 메소드

정적 메소드 사용하기

# 지금까지는 클래스의 메소드를 사용할 때 인스턴스를 통해 호출했다.
# 이번에는 인스턴스를 통하지 않고 클래스에서 바로 호출할 수 있는 정적 메소드와 클래스 메소드에 대해 알아보자.
# 정적 메소드는 메소드 위에 @staticmethod를 붙인다.
# staticmethod 의 앞에 붙는 @ 를 데코레이터라고 하며 메소드(함수)에 추가 기능을 구현할 때 사용한다.
# 정적 메소드는 매개변수에 self를 지정하지 않는다.
# 정적 메소드는 self를 받지 않으므로 인스턴스 속성, 메소드에는 접근할 수 없다.
# 그래서 보통 정적 메소드는 인스턴스 속성, 인스턴스 메소드가 필요 없을 때와
# 인스턴스의 상태를 변화시키지 않고, 입력 값이 같으면 언제나 출력 값이 같은 순수 함수를 만들 때 사용한다.
class Calc:
    @staticmethod
    def add(a, b):
        print(a + b)

    @staticmethod
    def mul(a, b):
        print(a * b)

    @staticmethod
    def add_mul(a, b):
        Calc.add(a, b)
        Calc.mul(a, b)


# 정적 메소드는 다음과 같이 클래스에서 바로 메소드를 호출하면 된다.
Calc.add(1, 2)  # 3
Calc.mul(1, 2)  # 2
Calc.add_mul(3, 4)  # 7 12

클래스 메소드 사용하기

# 이번에는 정적 메소드와 비슷하지만 약간의 차이점이 있는 클래스 메소드를 사용해보자
# 클래스 메소드는 메소드 위에 @classmethod 를 붙인다.
# 클래스 메소드는 첫 번째 매개변수에 cls를 지정해야 한다.
# 클래스 메소드는 정적 메소드처럼 인스턴스 없이 호출할 수 있다는 점은 같지만,
# 클래스 메소드는 메소드 안에서 클래스 속성, 클래스 메소드에 접근해야 할 때 사용한다.
# 특히 cls를 사용하면 메소드 안에서 현재 클래스의 인스턴스를 만들 수 있다.
# cls는 클래스이므로 cls()는 Person()과 같다.
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명 생성되었습니다.

Updated:

Leave a comment