자료실/파이썬(Python)

파이썬(Python) - 클래스 _ 메서드(method)

자료수집중 2020. 7. 16.
반응형

클래스의 메서드에 대해서 조금 더 알아보겠습니다.

 

처음으로 클래스 메서드 인스턴스 메서드입니다.

앞에서 했던 클래스 변수와 인스턴스 변수와 같은 맥락입니다.

클래스 메서드도 같은 클래스의 인스턴스들과 공유가 됩니다.

클래스 메서드의 기본형은 다음과 같습니다.

@classmethod
def 함수명(cls, ...):
    수행할 코드

@classmethod는 데코레이터로 정의된 함수를 이용해서 다른 함수를 추가해주는 의미로 @함수명 입니다.

 

 

다음으로 인스턴스 메서드의 기본형은 다음과 같습니다.

def 함수명(self, ...):
    수행할 코드

가장 큰 차이는 첫 번째 매개변수가 clsself란 점입니다.

어떤 차이냐면 cls는 자기 자신의 클래스를 뜻합니다. self는 객체를 뜻합니다.

클래스 메서드에는 인스턴스 변수를 사용할 수 없지만 인스턴스 메서드에서는 클래스 변수를 사용할 수 있습니다.

예제로 살펴보겠습니다.

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

    def __init__(self, name, age, count=None):
        self.name = name  # 인스턴스 변수
        self.age = age
        Person.__count += 1

    def show(self): # 인스턴스 메서드
        print("이름 : ", self.name)
        print("나이 : ", self.age)
        print("등록된 사람 수 : ", Person.__count, "\n")

    @classmethod
    def countShow(cls): # 클래스 메서드
        print("등록된 사람 수 : ", cls.__count, "\n")


a = Person("홍길동", 24)
a.show()
a.countShow()
Person.countShow()

클래스 메서드는 인스턴스, 클래스 모두 사용할 수 있습니다.

하지만 인스턴스 메서드는 해당 객체가 없기 때문에클래스에서 사용하면 예외가 발생합니다.

 

 

다음으로 정적 메서드(static method)입니다.

정적 메서드의 기본형은 다음과 같습니다.

@staticmethod
def 함수명(매개변수, ...):
    수행할 코드 

@staticmethod 데코레이터를 사용하여 정의합니다.

 

 

정적 메서드는 클래스 메서드와 굉장히 유사합니다.

인스턴스에서 호출할 수 있고 클래스에서도 호출할 수 있습니다.

대신 clsself를 받지 않습니다.

class Calculation:
    sum = 0

    @staticmethod
    def add(num1, num2):
        print(num1 + num2, "\n")


a = Calculation
a.add(15, 21)
Calculation.add(10, 19)

 

 

처음 클래스를 할 때 생성자와 소멸자를 하면서 잠깐 언급한 __add__에 대해서 조금 더 알아보겠습니다.

특수 메서드는 굉장히 종류가 많습니다.

그중에서 연산자 메서드에 대해서 알아보겠습니다.

연산자 메서드란 객체와 객체끼리 연산을 해주는 메서드입니다.

보통 클래스에서 재정의 해서 사용하는데 이걸 연산자 오버로딩이라고 합니다.

먼저 어떤 게 있는지 살펴보면

*노란색으로 표시된 메서드는 함수명 앞에 r를 붙이면 ex) __radd_  좌변과 우변이 서로 바꿔서 연산됩니다.

 

 

연산자 메서드도 결국 메서드입니다.

일반 메서드를 사용하듯 사용할 수 있으나, 연산자 메서드는 더욱 쉽게 사용할 수 있습니다.

바로 연산자를 이용해서 사용할 수 있다는 장점입니다.

몇 가지만 예제로 살펴보겠습니다.

class Calculation:
    sum = 0

    def __init__(self, value):
        self.value = value

    def __pos__(self):
        self.value += 10
        print(self.value, "\n")

    def __add__(self, other):
        print(self.value + other.value, "\n")

    def __sub__(self, value):
        self.value -= value
        print(self.value, "\n")


a = Calculation(100)
+a

b = Calculation(50)
a.__add__(b)
a + b

a - 100

인스턴스 변수에 100을 입력받은 Calculation의 인스턴스 a가 있습니다.+a는 바로 __pos__ 메서드를 실행시키기 위한 방법입니다.앞에서 연산자 메서드의 가장 큰 특징은 일반 메서드처럼 호출해서 사용해도 되지만 연산자 만으로도 사용이 가능하다 했습니다. __pos__는 매개변수로 self만 존재합니다. 그러므로 다른 객체 없이 자신에게만 연산자만으로 호출이 가능합니다.__add__는 self와 other로 매개변수가 2가지입니다. 여기서 other은 다른 객체를 의미합니다.그래서 Calculation의 인스턴스 b를 새롭게 생성해서 a + b를 하면 __add__가 호출되어 메서드의 명령이 실행됩니다.__sub__를 보면 상수를 매개변수로 이용할 수 있습니다.

어떤 식으로 재정의하느냐에 따라서 사용방법도 조금씩 다릅니다.

 

 

 

댓글