클래스 변수(Class Variable) vs 인스턴스 변수(Instance Variable)
파이썬에서 클래스의 __init__() 함수 외부에 선언된 모든 변수는 클래스 변수이며, 함수 내부에 선언된 변수는 인스턴스 변수입니다.
두 변수의 가장 큰 차이점은 다음과 같습니다.
- 클래스 변수: 해당 클래스로 생성된 모든 인스턴스가 값을 공유합니다. 클래스 자체에 속하므로 한 곳에서 값을 변경하면 모든 객체에 동일하게 적용됩니다.
- 인스턴스 변수: 각 객체(인스턴스)마다 독립적으로 유지됩니다. 특정 객체에서만 값이 변경되며 다른 객체에는 영향을 주지 않습니다.
아래 예제 코드를 통해 두 변수의 차이를 더 명확하게 이해할 수 있습니다.
예제 코드
class MyClass:
stat_elem = 456 # 클래스 변수
def __init__(self):
self.object_elem = 789 # 인스턴스 변수
c1 = MyClass()
c2 = MyClass()
# 두 요소의 초기값 확인
>>> print(c1.stat_elem, c1.object_elem)
456 789
>>> print(c2.stat_elem, c2.object_elem)
456 789
# 클래스 변수 변경 시도
MyClass.static_elem = 888
>>> print(c1.stat_elem, c1.object_elem)
888 789
>>> print(c2.stat_elem, c2.object_elem)
888 789
# 인스턴스 변수 변경 시도
c1.object_elem = 777
>>> print(c1.stat_elem, c1.object_elem)
888 777
>>> print(c2.stat_elem, c2.object_elem)
888 789
실행 결과 분석
1. 초기값 확인
c1과 c2는 같은 클래스로 생성된 서로 다른 객체이지만, 초기 상태에서는 클래스 변수(456)와 인스턴스 변수(789)가 각각 동일한 값을 출력합니다.
2. 클래스 변수 변경
MyClass.static_elem = 888처럼 클래스 레벨에서 변수를 수정하면, c1과 c2 양쪽 모두에서 변경된 값(888)이 출력됩니다. 이는 클래스 변수가 모든 인스턴스에 의해 공유되기 때문입니다.
3. 인스턴스 변수 변경
반면 c1.object_elem = 777으로 특정 객체의 인스턴스 변수를 변경하면, c1에서만 값이 777로 바뀌고 c2는 여전히 기존 값(789)을 유지합니다.
정리
이처럼 파이썬에서 변수를 어디에 선언하느냐에 따라 데이터 공유 범위가 달라집니다. 모든 객체가 공통으로 사용해야 하는 값(설정값, 카운터 등)은 클래스 변수로, 객체마다 고유하게 가져야 하는 값(이름, 상태 등)은 인스턴스 변수로 선언하는 것이 올바른 설계 방식입니다.