파이썬에서 클래스 내부에 선언되지만 어떤 메서드에도 속하지 않는 변수를 클래스 변수(class variable) 또는 정적 변수(static variable)라고 합니다.
클래스 변수는 클래스 이름을 통해 참조할 수 있으며, 인스턴스를 통해서는 직접 접근하는 방식과 구분됩니다. 또한 클래스 변수는 같은 이름을 가진 다른 멤버 변수(인스턴스 변수)와 서로 충돌하지 않고 완전히 독립적으로 동작한다는 특징이 있습니다.
예제 1: 클래스 변수의 기본 사용법
아래 프로그램은 클래스 변수가 어떻게 활용되는지 보여줍니다.
class Fruits(object):
count = 0
def __init__(self, name, count):
self.name = name
self.count = count
Fruits.count = Fruits.count + count
def main():
apples = Fruits("apples", 3)
pears = Fruits("pears", 4)
print(apples.count)
print(pears.count)
print(Fruits.count)
print(apples.__class__.count) # Fruits.count와 동일
print(type(pears).count) # 역시 Fruits.count
if __name__ == '__main__':
main()실행 결과
3 4 7 7 7
결과 분석
인스턴스 변수 apples.count와 pears.count는 각각 3과 4로 출력되지만, 클래스 변수 Fruits.count는 생성자에서 두 객체의 개수가 누적되어 7이 됩니다. __class__ 속성이나 type() 함수를 통해서도 같은 클래스 변수에 접근할 수 있습니다.
예제 2: 인스턴스를 통한 접근과 값 변경
다음 예제는 클래스 레벨에 정의된 변수의 동작 방식을 더 자세히 보여줍니다.
class example:
staticVariable = 9 # 클래스를 통해 접근
print(example.staticVariable) # 9 출력
# 인스턴스를 통해 접근
instance = example()
print(instance.staticVariable) # 다시 9 출력
# 인스턴스 내부에서 값 변경
instance.staticVariable = 12
print(instance.staticVariable) # 12 출력
print(example.staticVariable) # 여전히 9 출력실행 결과
9 9 12 9
동작 원리 설명
인스턴스를 통해 staticVariable에 새로운 값을 할당하면, 실제로는 해당 인스턴스에만 속한 새로운 인스턴스 변수가 생성됩니다. 따라서 instance.staticVariable은 12를 반환하지만, 클래스 변수 자체인 example.staticVariable은 그대로 9를 유지합니다.
이처럼 파이썬에서 클래스 변수와 인스턴스 변수는 이름이 같더라도 별개의 공간에 저장되므로, 상황에 맞게 적절히 활용하는 것이 중요합니다.