Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python에서 클래스 변수를 올바르게 정의하는 방법

클래스 변수란 무엇인가?

클래스 변수(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 = 값처럼 인스턴스를 통해 클래스 변수에 대입하면, 기존 클래스 변수가 수정되는 것이 아니라 같은 이름의 새로운 인스턴스 변수가 생성되므로 주의해야 합니다. 클래스 변수를 변경하려면 반드시 클래스 이름을 통해 접근하는 것이 안전합니다.