초보 개발자

파이썬 인스턴스 변수, 클래스 변수, 인스턴스 메서드, 클래스 메서드 본문

Python/이것 저것

파이썬 인스턴스 변수, 클래스 변수, 인스턴스 메서드, 클래스 메서드

taehyeki 2021. 12. 26. 17:43

 

class Person():
	people_cnt = 0
    def __init(self,name):
    	self.name = name
    	Person.people_cnt += 1
    @classmethod
	def get_cnt(cls):
    	print(cls.people_cnt)
    
    def get_cnt2()
    	print(Person.people_cnt)
    
    def get_name(self):
    	print(self.name)
    
kim = Person('kim')
lee = Person('Lee')

이러한 클래스가 있다고 가정해보자 기본적으로 people_cnt라는 클래스 변수를 0으로 지정해두었다. 그리고 객체가 생성될 때 인스턴스 메소드 __init__이 실행이된다. self.name(인스턴스 변수)에 name이들어가고 Person.people_nct(클래스 변수)에는 기존 값에 +1 이 되어진다. 여기서 인스턴스 변수에 접글할때는 self를 붙이고 클래스 변수에 접근할 때는 Person(클래스 명)을 붙여주어야 한다.

 

클래스 변수를 사용하는 이유는 클래스에서 공통적으로 사용될 수 있는 요소가 필요하기 때문이다.

위의 예에서는 생성된 클래스 요소가 몇개인지 전체 개수를 세기 위해서 존재한다.

kim.get_name()

이 인스턴스 메서드가 실행이 된다고 가정해보자. 그럼 파이썬 인터프리터는 이걸 아래와 같이 바꿔 해석한다.

Person.get_name(kim)

 따라서 실제로 아래의 함수는

def get_name(self):
    print(self.name)

self에 kim객체가 들어오고 그 kim이 가지고 있는 개별적인 인스턴스 변수 name에 접근하여 name이 출력이 되는 것이다.

 

근데 클래스 변수에 접근 할 때는 굳이 self를 받아오지 않아도 된다. (self를 통해 접근하는 것이 아니기 때문)

def get_cnt2()
	print(Person.people_cnt)

이 경우에 kim.get_cnt2()를 실행하면 어떻게 될까???

방금 인터프리터에서 Person.get_cnt2(kim) 이렇게 해석한다고 했다. 그런데 우리는 매개변수에 self를 주지 않았다. 따라서 매개변수가 없는데 인자가 있으니 에러가 발생한다. 이 경우에 클래스객체에서 직접 호출하면 즉, Person.get_cnt2()를 하면 오류없이 잘 출력이 가능하다.

 

물론 self를 넣어주면 kim.get_cnt2()가 실행이 잘 될 것이다.

반대로 이 경우에는 Person.get_cnt2()에는 오류가 날 것이다. 매개변수가 존재하는데 인자가 없으니.. 

 

이러한 로직으로 흘러가는 걸 이해했다. 하지만 우리가 메소드를 호출할 때 클래스 이름으로 호출하지는 않는다

Person.get_cnt2()이것 보다는 kim.get_cnt2()이렇게 호출하는 것이 더 자연스럽다.그럼 이 경우에는 어떻게 해주어야 자연스러울까?? (클래스 변수에 접근할 때) 

 

바로 클래스 메소드를 사용해주면 된다.

@classmethod
def get_cnt(cls):
	print(cls.people_cnt)

이렇게 해주면 된다. @classmethod를 붙여주면 자동으로 매개변수cls안에 Person클래스가 들어간다.

매개변수 이름은 cls라고 관례적으로 적어준다. cls.people_cnt로 접근하면 클래스 변수에 잘 접근할 수 있다.

 

이렇게 해줄 경우에 

kim.get_cnt()로 해줘도 오류가 나지 않고 Person.get_cnt()로 해줘도 오류가 안난다. 

@classmethod의 힘이다.