method를 사용할 때 변수로 cls를 받는 것도 있고, self를 받는 것도 있고 아무것도 안받는 것도 있어서 이 차이에 대해 궁금하게 돼서 알아보게 됐다.
우선 저 차이를 이해하기 위해선 클래스와 인스턴스에 대해서 먼저 알아야 한다.
클래스는 객체(Object)를 만들기 위한 방법이다. 클래스는 변수와 객체 그리고 관련된 기능을 선언할 수 있다.
클래스는 쉽게 말해 붕어빵을 만드는 붕어빵 틀과 그걸 사용해 만든 붕어빵이다. 여기서 클래스는 붕어빵 틀을 말하고 붕어빵 틀에 의해 만들어진 붕어빵이 객체(Object)이다.
클래스로 만든 객체에는 중요한 특징이 있는데, 바로 객체마다 고유한 성격을 가진다는 것이다. 붕어빵 틀로 만든 붕어빵에 앙금을 다른걸 넣거나, 꼬리를 먹어버려도 다른 붕어빵에는 아무 영향이 없는 것과 마찬가지로 동일한 클래스로 만든 객체들은 서로 아무런 영향을 주지 않는다.
인스턴스는 클래스의 객체가 소프트웨어에 실체화된 것을 말한다. 객체는 클래스의 생성자를 사용하여 생성한다. 이 객체를 클래스의 인스턴스라 부른다.
클래스로 만든 객체를 인스턴스라고도 한다. 그렇다면 이 둘의 차이는 뭘까?
a = 붕어빵()
이렇게 만든 a는 객체이다. a는 붕어빵의 인스턴스이다. 즉, 인스턴스라는 말은 특정 객체(a)가 어떤 클래스(붕어빵)의 객체인지를 관계 위주로 설명할 때 사용한다.
파이썬에는 3가지의 method 타입이 있다. static, class, instance method는 각각 다른 기능을 가지고 필요에 따라 선택해서 사용해야 한다.
static method는 생성할 때 @staticmethod를 명시해줘야 한다. static method의 가장 중요한 특징은 인스턴스화 하지 않고 method를 호출할 수 있다는 것이다. 독립적으로 사용되기 때문에 다른 속성에 접근하거나 해당 클래스 내의 다른 method를 호출할 수 없다.
class 붕어빵:
@staticmethod
def 골라봐유(종류):
if 종류 == "팥":
print("팥은 두 개에 천원")
else if 종류 == "슈크림":
print("슈크림은 한 개에 천원")
else:
print("다른 건 없는디?")
손님1 = 붕어빵.골라봐유("팥")
class method는 @classmethod를 명시해줘야 한다. calss method 또한 클래스를 인스턴스화 하지 않아도 호출이 가능하다. 여기서 인스턴스화를 하지 않아도 된다는 말은 a = 붕어빵()
이렇게 안해도 사용할 수 있다는 말이다. 그리고 차이점은 다른 method 및 클래스 속성에 접근할 수 있는 기능에 의존하지만 인스턴스 속성은 없다.
class 붕어빵:
남은_붕어빵 = 50
@classmethod
def 남은_붕어빵_개수(cls, 판_붕어빵):
cls.남은_붕어빵 -= 판_붕어빵
print("이제 {남은_개수} 개만 다 팔면 퇴근이야".format(남은_개수 = cls.남은_붕어빵))
붕어빵.남은_붕어빵_개수(10)
instance method는 클래스를 인스턴스화 했을 때만 호출이 가능하다. 해당 클래스의 객체가 생성되면 instance method를 호출하고 예약어 self를 통해 해당 클래스의 모든 속성에 접근할 수 있다. instance method는 새 인스턴스 속성을 creating, getting 및 setting 하고 다른 인스턴스, 클래스 및 정적 메소드를 호출할 수 있다.
class 붕어빵:
남은_붕어빵 = 50
def 총_붕어빵_개수(self):
self.만든_개수 = 8
self.남은_붕어빵 += self.만든_개수
print(self.만든_개수)
print(self.남은_붕어빵_개수)
사장님 = 붕어빵()
사장님.총_붕어빵_개수()
cls, self의 차이점은 method 타입에 있다. instance method를 사용하면 self를 사용하고, class method를 사용하면 cls를 사용한다. static method는 속성에 접근할 수 없기 때문에 사용하는 변수가 없다.
즉 cls와 self는 클래스 속성에 접근하기 위한 방법이고 method 종류에 따라 cls와 self를 사용한다.