이 글의 작성자는 C/C++ 프로그래밍을 하던 사람이다. 이 글은 Python을 복습하며 작성하는 글이니, 부족한 부분이 있으면 얼마든지 피드백을 주시기 바란다.

 

클래스의 속성을 추가하는 방법을 알았으니, 이제는 메서드를 추가할 차례다. 파이썬의 클래스에서 제공하는 메서드는 총 3종류가 있다. 하나씩 알아보도록 하자.

 

인스턴스 메서드(instance method)

갑자기 인스턴스란 말이 나와서 혼란스러울 수도 있다. 대충 인스턴스는 객체같은 것이라고 생각하자.

엄밀히 따지자면 인스턴스와 객체는 다른 의미이긴 하다. ‘object vs instance’로 검색하면 그 결과들이 많이 보일 것이나, 비슷한 의미로 사용된다.

그러면 인스턴스 메서드는 어떻게 만드느냐? 별거 없다. 그냥 클래스 안에다 만들기만 하면 된다.

class person:
    def __init__(self, _name, _age):
        self.name = _name
        self.age = _age

    def introduce(self):
        print("안녕하세요! 저는", self.name, "입니다!", self.age, "살 이에요!")

위의 introduce가 인스턴스 메서드의 형태로 구현되었다.

인스턴스 메서드의 특징은, 첫 번째 인자로 self, 즉 자기 자신을 가리키는 매개 변수가 존재한다라는 것이다. 따라서 이 함수는 객체마다 출력되는 결과가 달라질 수 있다는 것을 의미한다. 객체마다 객체 속성은 다를 수 있기 때문이다.

 

클래스 메서드(class method)

다음으로는 클래스 메서드(class method)에 대해 알아보자. 클래스 메서드는 이렇게 만든다. 클래스 메서드를 설명하기 위해 클래스 속성을 하나 추가했다.

class person:
    count = 0

    def __init__(self, _name, _age):
        self.name = _name
        self.age = _age
        person.increasePersonCount()

    def introduce(self):
        print("안녕하세요! 저는", self.name, "입니다!", self.age, "살 이에요!")

    @classmethod
    def increasePersonCount(cls):
        cls.count += 1

가장 마지막으로 정의된 메서드, increasePersonCount 메서드가 클래스 메서드이다. 잘 보면 classmethod라는 데코레이터가 보일 것이다.

그렇다. 클래스 메서드를 만드는 방법은 classmethod 데코레이터를 쓰면 된다.
그리고 첫 번째로 들어오는 인자의 이름이 cls로 바뀐 것도 눈에 들어올 것이다. 인스턴스 메서드와는 달리, 클래스 메서드의 첫 번째 인자는 클래스 자체가 들어온다. cls 인자를 출력해보면 다음과 같이 나오는 것을 볼 수 있을 것이다.

<class '__main__.person'>

클래스 메서드에서는 실제로 생성된 객체를 가리키는 인자가 들어오지 않으므로, 객체 속성에는 접근할 수 없다. 대신 클래스 속성에는 접근할 수 있다.

위의 코드에서 변화한 부분들을 살펴보라. 클래스 속성인 count가 추가되었고, 새로운 person 객체가 생성되었을 때, increasePersonCount을 호출하여 클래스 속성인 count의 값을 1씩 증가시키고 있다. 즉, 지금까지 생성된 person 객체의 수를 세는 행동을 추가한 것이다.

이런 식으로 person 개개인의 속성이 아니라 클래스 자체의 속성을 다룰 때 주로 사용하게 될 형태의 메서드이다.

 

스태틱 메서드(static method)

마지막으로 스태틱 메서드(static method)에 대해 알아보자. 이번에는 스태틱 메서드 하나만 추가한다.

class person:
    count = 0

    def __init__(self, _name, _age):
        self.name = _name
        self.age = _age
        person.increasePersonCount()

    def introduce(self):
        print("안녕하세요! 저는", self.name, "입니다!", self.age, "살 이에요!")

    @classmethod
    def increasePersonCount(cls):
        cls.count += 1

    @staticmethod
    def aboutPerson():
        print('사람을 표현하고 있어요')

가장 마지막으로 정의된 메서드, aboutPerson 메서드가 스태틱 메서드이다. 클래스 메서드와 유사한 점을 볼 수 있는데, staticmethod를 데코레이터로 사용하고 있다는 점이다. 스태틱 메서드도 데코레이터 하나만 붙이면 스태틱 메서드가 된다.

그리고 또 하나 중요한 차이점이 보인다. 자기 자신을 가리키는 객체나 클래스 정보가 전혀 들어오지 않는다는 점이다. 따라서 스태틱 메서드에서도 객체 속성에는 접근할 수 없다.

사실상 클래스 밖에 선언된 함수와 다를 바가 없기 때문에 이걸 어떻게 써야 하나라는 의견도 존재한다. 개인적으로는 네임스페이스를 나누는 것 정도로 쓰임새가 있다고 보고 있다. (특정 클래스에 대한 help() 함수를 구현한다던가 정도로)

 

메서드들에 대한 설명을 하다보니, 어느새 person 클래스는 어느정도의 형태를 갖추게 되었다. person 객체를 생성할 때 이름과 나이를 입력받고, 이를 기반으로 자기소개를 하는 메서드까지 만들었다.

 

Categories:

Updated:

Comments