본문 바로가기

python

Python - 클래스 변수와 인스턴스 변수 - 공부 생각 노트

변수라고 하면 변하는 값을 말한다. 어떤 함수가 있다면 그 곳에 변하는 값을 지정? 해주고 호출할 때 함수에 변수를 삽입함으로써 함수가 변수를 조작해서 결과값을 리턴하는 방식 혹은 도출한다.

 

그렇다면 일명 붕어빵 틀이라고 하는 클래스의 변수, 그리고 그 클래스(내 생각엔 새로운 사용자 지정? 데이터 타입)를  적용한 생성된 인스턴스의 변수를 이번에 파헤쳐 볼 것이다.

( 이번 정리는  https://wikidocs.net/1744를 참고했다. )

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

다음 은행 계좌 클래스를 만들어보자 Account 클래스 안에는 생성자와 소멸자가 있다.

생성자(__init__)가 클래스의 인스턴스가 생성될 때 자동으로 호출되는 함수이고

소멸자(__del__)는 클래스의 인스턴스가 소멸될 때 자동으로 호출되는 함수이다.

class Account :
	num_accounts = 0
    def __init__(self, name) :
    	self.name = name
        Account.num_accounts += 1
    def __del__(self) :
    	Account.num_accounts -= 1

위 Account 클래스에는 num_accounts 와 self.name 이라는 두 종류의 변수가 있다. num_accounts 처럼 클래스 내부에

선언된 변수를 클래스 변수라고 하며, self.name 과 같이 self가 붙어있는 변수를 인스턴스 변수라고 한다.

클래스 변수는 Account 클래스의 네임스페이스에 위치하며, self.name과 같은 인스턴스 변수는 인스턴스 네임스페이스에 위치하게 된다.

더보기

여기서 네임 스페이스란, 변수가 객체를 바인딩( 프로그램 기본단위 (예 : 변수)에 기본 단위가 가질 수 있는 속성 중에서 일부 필요한 속성만을 선택하여 연결해 주는 것을 말한다.) 할 때 그 둘 사이의 관계를 저장하고 있는 공간을 의미한다.

변수 <--네임스페이스(관계 저장 공간)--> 객체

< 간단 정리 >

 

클래스 네임스페이스 in ( 클래스 정의 , 클래스 변수 )

인스턴스 네임스페이스 in ( 특정 클래스 타입으로 생성된 인스턴스 , self , self.name 변수(인스턴스 변수) )

※ 전에 배웠듯이 인스턴스 네임스페이스에서 찾고자하는 변수가 없을 때는 생성시킨 클래스 네임스페이스에 가서 찾는다. 하지만 클래스와 인스턴스는 각각의 독립된 네임스페이스를 가진다.

 

그렇다면 언제 클래스 변수를 사용하고 언제 인스턴스 변수를 사용해야 할까? 간단한 코드를 작성해보자.

내가 은행에 가서 계좌를 개설하면 새로운 계좌가 하나 개설된다. 이런 상황을 파이썬으로 표현하면

Account 클래스의 인스턴스를 생성하는 것에 해당한다.

kim = Account("kim")
lee = Account("lee")

생성된 kim 과 lee 인스턴스에 계좌 소유자 정보가 확실히 저장되었는지 확인해보자.

각 계좌에 대한 소유자 정보는 인스턴스 변수인 name 이 바인딩 하고 있다.

>>> kim.name
'kim'
>>> lee.name
'lee'
>>>

그럼 지금까지 은행에서 개설된 계좌는 총 몇개일까? 2개다. kim,lee 인스턴스를 통해 num_accounts 라는 이름에 접근하게 되면 총 계좌 개설개수가 2개로 나오는 것을 알 수 있다.

( 왜 두개냐? Account 클래스에서 정의된( __init__ )함수가 name이 하나 입력될 때마다 num_accounts 가 0에서 +1씩 증가되어 저장되기 때문에 인스턴스에서 2개 바인딩 됐으므로 num_accounts = 2 가 저장되어있다.

>>> kim.num_accounts
2
>>> lee.num_accounts
2

당연히 kim 인스턴스 네임스페이스에서는 num_accounts 이 없기 때문에 클래스 네임스페이스에 있는 해당 이름을 가진 값을 반환 한 것임을 위에서 설명했듯이 알 수 있다.

이렇게 여러 인스턴스 간에 서로 공유해야하는 값은 클래스 변수를 통해 바인딩 해야 한다. 왜냐하면 파이썬은

인스턴스의 네임스페이스에 없는 이름은 클래스의 네임 스페이스에서 찾아보기 때문에 이러한 특성을 이용하면 클래스 변수가 모든 인스턴스에 공유될 수 있기 때문이다. 참고로 클래스 변수에 접근 할 때 아래와 같이 클래스 이름을 사용할 수도 있다.

>>> Account.num_accounts
2

클래스 변수와 인스턴수 변수는 아래 그림으로 정리가 된다.

클래스 변수와 인스턴수 변수