클래스 변수(class variable)와 인스턴스 변수(instance variable)

양승민·2022년 1월 14일

파이썬

목록 보기
1/1
post-thumbnail
class Factory:
	num = 0 # 클래스 변수
    def increaseClassNum(self):
    	Factory.num += 1 # 클래스를 이용한 변수 접근
    def increaseInstanceNum(self):
    	self.num += 1 # 인스턴스 변수

클래스 변수는 Class 선언시 바로 아래 self.~ 형태가 아닌 변수,
인스턴스 변수는 self.~ 형태의 변수라고 생각하면 된다.

클래스 변수와 인스턴스 변수는 몇 가지 특징이 있다.
1. 클래스 변수는 모든 인스턴스가 공유할 수 있다.
2. 인스턴스에서 인스턴스 변수를 클래스 변수와 동일한 이름으로 선언할 경우, 인스턴스에서 변수 호출시 클래스 변수가 아닌 인스턴스 변수를 호출하게 된다.

시나리오

좀 더 상세히 알기 위한 여러 케이스에 대한 시나리오이다.

id 가 같으면 동일함을 의미합니다.

  1. Factory 인스턴스 A 생성
  2. A 의 increaseClassNum() 수행
    • id(A.num) == id(Factory.num)
    • A.num : 1
    • Factory.num : 1
  3. Factory 클래스를 통해 직접적으로 num 을 3으로 수정
    • id(A.num) == id(Factory.num)
    • A.num : 3
    • Factory.num : 3
  4. Factory 인스턴스 B 생성
    • id(A.num) == id(B.num)
    • B.num : 3
    • Factory.num : 3
  5. B 의 increaseClassNum() 수행
    • id(A.num) == id(B.num)
    • A.num : 4
    • B.num : 4
    • Factory.num : 4
  6. B 의 increaseInstanceNum() 수행
    • id(A.num) != id(B.num)
    • id(A.num) == id(Factory.num)
    • id(B.num) != id(Factory.num)
    • A.num : 4
    • B.num : 5
    • Factory.num : 4

시나리오에 대한 코드와 각 출력값을 기록했습니다.

# 1. Factory 인스턴스 A 생성
A = Factory()

# 2. A 의 increaseClassNum() 수행
A.increaseClassNum()

print(id(A.num) == id(Factory.num))  # True

print(A.num)  # 1
print(Factory.num)  # 1

# 3. Factory 클래스를 통해 직접적으로 num 을 3으로 수정
Factory.num = 3

print(A.num)  # 3
print(Factory.num)  # 3

# 4. Factory 인스턴스 B 생성
B = Factory()

print(id(A.num) == id(B.num))  # True
print(B.num)  # 3
print(Factory.num)  # 3

# 5. B 의 increaseClassNum() 수행
B.increaseClassNum()

print(id(A.num) == id(B.num))  # True
print(A.num)  # 4
print(B.num)  # 4
print(Factory.num)  # 4

# 6. B 의 increaseInstanceNum() 수행
B.increaseInstanceNum()

print(id(A.num) == id(B.num))  # False
print(id(A.num) == id(Factory.num))  # True
print(id(B.num) == id(Factory.num))  # False
print(A.num)  # 4
print(B.num)  # 5
print(Factory.num)  # 4
profile
틈틈히 공부 홀릭

0개의 댓글