본문 바로가기
Software/Python

[파이썬의 기본] 클래스 메소드(Class Method) & 스태틱 메소드(Static Method)

by lovey25 2019. 7. 8.

앞서 클래스를 정의하고 사용하는 기본적인 방법에 대해서 알아봤었는데요. ([파이썬의 기본] 클래스(Class)) 이런 기본적인 메소드의 사용방법을 인스턴스 메소드(Instance Method)라고 합니다. 메소드가 클래스의 인스턴스로 호출이 되고 첫번째 파라미터인 "self"로 인스턴스 자기자신이 자동으로 전달되는 방식입니다. 

이 번에는 그외 사용방법인 클래스 메소드(Class Method), 스태틱 메소드(Static Method)에 대해서 정리하겠습니다.

Class Methods

클래스 메소드는 클래스에서 호출이되고 인스턴스 메소드가 첫번째 파라미터로 자신의 인스턴스를 "self"로 전달하는 것과는 달리 "cls"라는 파라미터로 자신의 클래스를 전달합니다. 

용도는 클래스 생성자에 다른 형태의 파라미터를 전달하기위해 사용한다고 합니다. 인스턴스 메소드에서는 인스턴스에 국한하여 데이터를 사용한다면 클래스 메소드는 인스턴스가 공유하는 클래스 데이터를 사용할 수 있습니다.

클래스 메소드를 지정하기위해서는 classmethod 라는 키워드를 사용하는데 골뱅이(@)표시와 합께 키워드를 표시해서 메소드가 클래스 메소드임을 표시합니다. 여기서"@classmethod"같은 표식을 데코레이터(decorator)라고 합니다. 데코레이터는 해당 블럭의 앞뒤를 다른 코드로 둘러싸주는 용도로 사용될 수 있는데 "@classmethod"는 파이썬이서 내장된 코드가 있어서 그 코드로 둘러싸서 클래스 메소드로 변경이 되는구나 정도로 이해하고 있습니다.

예제:

class Store:
    def __init__(self, jjajang, jjampong):
        self.jjajang = jjajang 
        self.jjampong = jjampong

    def total_order(self):
        return (self.jjajang + self.jjampong)

    @classmethod 
    def same4each(cls, double):
        return cls(double, double) 

Order1 = Store(3,2)
print(Order1.total_order())

Order2 = Store.same4each(3)
print(Order2.total_order())

결과:

"Store"라는 클래스는 짜장면과 짬뽕이 각각 몇개인지 2개의 파라미터를 입력받고 있습니다. 그런데 여기서 "same4each"를 클래스 메소드로 만들어서 한개의 파라미터만 입력받는대신 입력받은 파라미터를 동일하게 두개의 파라미터로 만들어서 "cls"라는 새로운 클래스 객체를 통해 반환했습니다. 여기서 사용한 "cls"라는 표현은 다른 표현으로 바꾸어서도 사용할 수 있으나 클래스라는 표현으로 cls를 많이들 사용해서 관용적으로 사용된다고 합니다.

Static Methods

스태틱 메소드는 인스턴스나 클래스를 인자로 받지않는 메소드입니다. 클래스 안에 있지만 일반 함수와 다를게 없는 메소드라서 클래스의 인스턴스에서 호출할수 있다는 것외에는 차이점이 없습니다. 클래스 안에 정의해서 클래스와의 어떤 연관성을 표현하는 기능정도로 사용된다고 합니다.

"staticmethod"라는 키워드로 데코레이터를 써서 사용할 수 있습니다.

예제:

class Store:
    def __init__(self, jjajang, jjampong):
        self.jjajang = jjajang 
        self.jjampong = jjampong

    def total_order(self):
        return (self.jjajang + self.jjampong)

    @classmethod 
    def same4each(cls, double):
        return cls(double, double) 

    @staticmethod
    def nameofstore():
        print("북경반점")

Order = Store(3,2)
Order.nameofstore()

결과:

 

끝!

728x90

댓글0