클래스 변수란 무엇인가?
클래스 변수(Class Variable)란 __init__ 메서드 외부에서 선언되는 변수를 말합니다. 이러한 변수는 클래스 인스턴스가 아닌 클래스 자체에 속하는 정적(static) 요소이며, 해당 클래스로 생성된 모든 인스턴스가 값을 공유한다는 특징이 있습니다.
반면 __init__ 메서드 안에서 self를 통해 선언된 변수는 인스턴스 변수로, 각 객체마다 독립적인 값을 가집니다. 두 변수의 차이를 예제 코드를 통해 살펴보겠습니다.
기본 예제
class MyClass:
__item1 = 123
__item2 = "abc"
def __init__(self):
# pass 또는 다른 초기화 코드위 코드처럼 메서드 바깥쪽, 즉 클래스 본문에 직접 작성된 변수가 클래스 변수입니다. 아래의 완전한 예제를 보면 개념이 더욱 명확해집니다.
인스턴스 변수와의 차이 비교
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.stat_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실행 결과 분석
위 결과에서 두 가지 중요한 동작을 확인할 수 있습니다.
첫째, MyClass.stat_elem = 888처럼 클래스 자체의 클래스 변수를 변경하면, 그 변경 사항이 c1, c2 등 모든 인스턴스에 동시에 반영됩니다. 클래스 변수는 클래스 하나에 단 한 번만 존재하기 때문입니다.
둘째, c1.object_elem = 777처럼 특정 인스턴스의 변수를 변경하면, 그 값은 해당 인스턴스(c1)에만 적용되고 다른 인스턴스(c2)에는 전혀 영향을 주지 않습니다. 인스턴스 변수는 각 객체별로 별도의 메모리 공간을 가지기 때문입니다.
정리 및 주의사항
Python에서 클래스 변수를 올바르게 사용하기 위해 다음 사항을 기억하세요.
- 모든 인스턴스가 공유해야 하는 값(설정 상수, 생성된 객체 개수 카운터 등)은 클래스 변수로 정의하는 것이 적합합니다.
- 인스턴스마다 고유해야 하는 값은 반드시
__init__메서드 안에서self.변수명 = 값형태로 정의해야 합니다. c1.stat_elem = 값처럼 인스턴스를 통해 클래스 변수에 대입하면, 기존 클래스 변수가 수정되는 것이 아니라 같은 이름의 새로운 인스턴스 변수가 생성되므로 주의해야 합니다. 클래스 변수를 변경하려면 반드시 클래스 이름을 통해 접근하는 것이 안전합니다.