Python 기초

클래스 변수

어떤 경우에는 객체와는 상관없이 사용하고 싶은 변수가 있을 수도 있습니다. 정상적인 경우라면 인스턴스 변수는 항상 객체를 통하여 사용하여야 합니다.

하지만 파이썬에서는 객체를 통하지 않고 사용할 수 있는 변수를 생성하는 것이 가능합니다. 이들 변수는 모든 객체를 통틀어서 하나만 생성되고 모든 객체가 이것을 공유하게 됩니다.

이러한 변수를 클래스 멤버(class member)라고 합니다. 변수를 정의할 때 클래스 내부에 메소드와 동일한 수준에서 정의하면 클래스 변수가 됩니다.

클래스 변수는 클래스당 하나만 생성되어서 모든 객체가 공유합니다.

 

인스턴스 변수 vs 클래스 변수

클래스의 멤버는 인스턴스 멤버와 정적 멤버로 나누어집니다.

 

파이썬에서 인스턴스 변수와 클래스 변수의 차이를 정확하게 이해하는 것도 중요합니다.

동일한 클래스 설계도를 이용하여 많은 객체들이 생성될 때 각각의 객체(인스턴스)들은 자신만의 변수를 가집니다.

이들 변수들은 인스턴스마다 별도로 생성되기 때문에 인스턴스 변수(instance variable)라고도 합니다.

Television 클래스에서 channel, volume, on은 모두 인스턴스 변수입니다. 각 객체는 이들 변수에 대하여 별도의 기억 공간을 가지고 있으며 각기 다른 값을 가지고 있습니다.

 

하지만 경우에 따라서는 모든 객체에 공통인 변수가 필요한 경우도 있습니다. 이것이 클래스 변수(class variable)입니다.

클래스 변수는 하나의 클래스에 하나만 존재합니다. 클래스 변수는 객체보다는 클래스와 연결되어 있습니다. 모든 객체들은 하나의 클래스 변수를 공유합니다.

클래스 변수를 만들려면 클래스 안이지만 메소드의 외부에 변수를 생성하면 됩니다. 클래스 변수는 인스턴스를 생성하지 않아도 사용이 가능합니다.

 

Television 클래스에 클래스 변수 serialNumber를 추가하면 다음과 같습니다. serialNumber 변수는 전체 객체를 통틀어서 딱 하나만 생성됩니다.

class Television:
    serialNumber = 0                            # 이것이 클래스 변수입니다.
    def __init__(self):
        Television.serialNumber += 1            # 클래스 변수를 하나 증가합니다.
        self.number = Television.serialNumber   # 클래스 변수는 앞에 클래스 이름을 붙여서 접근합니다.
# 클래스 변수의 값을 TV의 시리얼 번호로 합니다.
        ...