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

파이썬 클래스 속성과 인스턴스 속성의 차이 완벽 정리

클래스와 인스턴스 속성이란?

클래스는 다양한 객체를 생성하기 위한 일종의 설계도입니다. 클래스로부터 객체가 생성되면, 그 객체는 더 이상 클래스 속성에 의존하지 않고 자신만의 독립적인 속성을 가지게 됩니다. 즉, 클래스는 한 번 인스턴스가 만들어지면 해당 인스턴스의 속성 값을 직접 제어할 수 없습니다.

이러한 특성 때문에 파이썬에서는 클래스 속성(class attribute)인스턴스 속성(instance attribute)을 구분하는 것이 매우 중요합니다. 클래스 속성은 모든 인스턴스가 공유하는 값인 반면, 인스턴스 속성은 각 객체마다 개별적으로 존재하는 값입니다.

예제 코드

아래 예제에서 MainClass는 클래스 속성 class_attr을 가지고 있으며, 이 클래스로부터 생성된 객체들은 각자 고유한 인스턴스 속성 값을 가집니다. 이 값들을 출력해 보면 두 속성의 차이를 명확하게 확인할 수 있습니다. 주목할 점은 마지막에 클래스 자체로는 객체의 인스턴스 속성에 접근할 수 없다는 것입니다.

class MainClass(object):
    class_attr = 'Sun'
    def __init__(self, instance_attr):
        self.instance_attr = instance_attr

if __name__ == '__main__':
    obj1 = MainClass('Mon')
    obj2 = MainClass('Tue')

    # 인스턴스 속성 출력
    print(obj1.instance_attr)
    print(obj2.instance_attr)

    # 클래스 이름으로 클래스 속성 출력
    print(MainClass.class_attr)

    # 객체를 통해 클래스 속성 출력
    print(obj1.class_attr)
    print(obj2.class_attr)

    # 인스턴스 속성을 클래스 속성처럼 출력하면 에러 발생
    # print(MainClass.instance_attr)

실행 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

Mon
Tue
Sun
Sun
Sun

결과 분석

출력 결과를 살펴보면 몇 가지 중요한 사실을 알 수 있습니다.

1. 인스턴스 속성은 객체별로 독립적입니다. obj1obj2는 서로 다른 인스턴스 속성 값('Mon', 'Tue')을 가지며, 하나의 객체에서 값을 변경해도 다른 객체에는 영향을 주지 않습니다.

2. 클래스 속성은 어디서든 접근 가능합니다. 클래스 이름(MainClass.class_attr)으로도, 객체(obj1.class_attr, obj2.class_attr)를 통해서도 동일한 값 'Sun'에 접근할 수 있습니다. 객체에서 해당 이름의 속성을 찾지 못하면 파이썬이 자동으로 클래스 속성까지 검색하기 때문입니다.

3. 클래스는 인스턴스 속성에 접근할 수 없습니다. MainClass.instance_attr처럼 클래스 이름으로 인스턴스 속성에 접근하려 하면 AttributeError가 발생합니다. 인스턴스 속성은 오직 개별 객체에만 존재하기 때문입니다.