Python(파이썬) - 클래스 메서드 알아보기




    이전에 알아보았던 객체의 메서드와 변수는 인스턴스에 소속된 메서드와 변수였습니다

    이번에는 클래스에 소속되어 있는 메서드와 변수에 대해 알아보도록 하겠습니다.


    관련글 :


    Python(파이썬) - 객체(Object) - http://server-talk.tistory.com/210


    Python(파이썬) - 객체제작 - http://server-talk.tistory.com/212


    Python(파이썬) - Class(클레스)와 생성자 - http://server-talk.tistory.com/211


    Python(파이썬) - 인스턴스 변수와 메서드 - http://server-talk.tistory.com/213


    Python(파이썬) - 상속 - http://server-talk.tistory.com/214





     Python - 인스턴스 메서드와 클래스메서드란?




    인스턴스 메서드는 인스턴스에서 사용이되고, 클레스 메서드는 클래스에서만 사용할수 있습니다

    먼저 인스턴스 메서드부터 보겠습니다




    1. 인스턴스 메서드


    인스턴스 메서드 : 인스턴스에 따라서 다르게 동작하여야 되는 메서드 입니다



    C2 = Calc(20,10)
    C2.sum()
    


    위 코드를 보시면 C2에는 Calc 클래스의 인스턴스가 들어있습니다 그리고 C2의 인스턴스 메서드를 호출하게 되는것입니다

    즉 인스턴스에 있는 메서드를 출력하게 됩니다



    용도 : 인스턴스 혹은 변수의 따라서 다르게 동작하여야 되는 메서드들은 인스턴스의 소속으로 사용하게 됩니다



    2. 클래스 메서드


    클래스 메서드 : 클래스에 직접 접근하는 것이 클래스 메서드 입니다



    C2 = Calc(20,10)
    Calc.c_m()
    


    위 코드를 보시면 인스턴스가 들어있는 C2의 인스턴스 사용하여 호출하지 않고 Calc 클래스의 직접 접근하여 c_m 메서드를 호출하게 됩니다



    용도 : 인스턴스에 내부적인 데이터(변수)하고 상관없이 동작하는 메서드는 클래스 소속으로 사용하게 됩니다









     Python - 인스턴스 메서드와 클래스메서드란?



    파이썬에서는 클래스 소속의 메서드가 Static Method와 Class Method가 있습니다 우선 사용방법부터 알아보겠습니다



    class Cs:
        @staticmethod
        def s_m():
            print("Static method")
        @classmethod
        def c_m(cls):
            print("Class method")
    
    Cs.s_m()
    Cs.c_m()
    



    위 코드를 보시면 Static Method와 Class Method는 사용하는 방법은 메서드 위에 장식자를 입력하여야 됩니다

    Static 메서드는 위에 장식자(@staticmethod)만 입력하시면 되며, Class 메서드는 장식자(@classmethod)와 메서드에는 첫번쨰 매개변수가 꼭! 있어야 됩니다 인스턴스 메서드의 첫번째 매개변수처럼 매개변수를 입력하여 주시면 됩니다


    그리고 클래스 소속의 메서드의 사용시에는 직접 클래스를 입력후 메서드의 접근하시면 됩니다.






     Python - 클래스 메서드와 클래스 변수의 활용



    이번에는 클래스 변수를 이용하여 생성된 인스턴스의 개수를 만드는 클래스 메서드를 만들어보겠습니다



    i1 = Cs()
    i2 = Cs()
    i3 = Cs()
    i4 = Cs()
    Cs.get_count()
    




    위 코드의 i1 ~ i4까지 4개의 인스턴스가 만들어진 것을 볼 수 있으며, get_conut라는 클래스 메서드를 이용하여 생성된 인스턴스 개수를 확인하는 메서드입니다


    이제 클래스를 만들어 보겠습니다





    class Cs:
        conut = 0
        def __init__(self):
            Cs.conut = Cs.conut + 1
    
        @classmethod
        def get_count(cls):
            print(Cs.conut)
    
    i1 = Cs()
    i2 = Cs()
    i3 = Cs()
    i4 = Cs()
    Cs.get_count()
    




    위 코드의 생성자 코드를 보시면 Cs.conut + 1을 보실 수 있으며, 생성자를 실행할 때마다 변수명에 1을 더한 값을 넣는 과정으로 인스턴스의 개수를 추가하는 과정입니다


    그리고 클래스 변수를 사용 시에는 즉 클래스 안에 메서드 밖에는 변수명만 입력하며, 메서드 안에서는 클래스명 과  .(점)을 이용하여 변수를 접근하여야 됩니다.



    class Calc(object):
        def __init__(self, num1, num2):
            self.num1 = num1
            self.num2 = num2
        def sum(self):
             return self.num1 + self.num2
        def sub(self):
            return self.num1 - self.num2
     
    class Ref(Calc):
        def multi(self):
            return self.num1 * self.num2
     
    C2 = Ref(20,10)
    print(C2.sum())
    print(C2.multi())
    Calc.history()
    


    위 코드의 마지막 줄 Calc.history() 라는 클래스 메서드를 실행하면 메서드 안에 결괏값을 각각 출력하는 부분을 만들어 보겠습니다







     Python - 클래스 메서드와 클래스 변수의 응용




    class Calc(object):
        _history = []
        def __init__(self, num1, num2):
            self.num1 = num1
            self.num2 = num2
        def sum(self):
            result = self.num1 + self.num2
            Calc._history.append("add : "+str(result))
            return self.num1 + self.num2
        def sub(self):
            result = self.num1 - self.num2
            Calc._history.append("sub : "+str(result))
            return self.num1 - self.num2
    
        @classmethod
        def history(cls):
            for item in Calc._history:
                print(item)
    
    class Ref(Calc):
        def multi(self):
            result = self.num1 * self.num2
            Calc._history.append("multi : "+str(result))
            return self.num1 * self.num2
    
    C2 = Ref(20,10)
    print(C2.sum())
    print(C2.sub())
    print(C2.multi())
    Calc.history()
    


    위 코드는 Clac 클래스의 메서드를 추가한 코드입니다

    Calc 클래스의 인스턴스 메서드의 결괏값을 담기 위해 _history 변수를 선언하였고 Calc 클래스의 각각의 인스턴스 메서드에는 결괏값을 변수로 만들어 클래스 변수의 append 함수를 이용하여 배열(_history)의 배열을 추가하였습니다

    그리고 클래스 메서드 사용하였을 때 클래스 배열의 데이터를 출력하는 과정입니다 





    위의 출력결과를 확인하시면 추가한 클래스메서드의 결괏값이 잘출력되는것을 확인하실 수 있습니다


    Posted by Server-talk 서버이야기