인스턴스 속성 , 클래스 속성

Yeeun·2025년 4월 30일

Python

목록 보기
29/31

여기 Rectangle.x가 작동하지 않는 이유와 관련된 포스팅을 작성해 보았습니다.


클래스와 인스턴스 속성: Rectangle.x 왜 안 될까?

파이썬에서 객체지향 프로그래밍을 할 때, 클래스 속성과 인스턴스 속성의 개념을 이해하는 것은 매우 중요합니다. 특히, 클래스 속성인스턴스 속성의 차이를 잘 이해해야 코드에서 발생할 수 있는 오류를 방지할 수 있습니다. 이번 포스팅에서는 Rectangle.x와 같은 접근이 왜 제대로 작동하지 않는지, 그리고 그 이유를 설명하려고 합니다.

클래스와 인스턴스 속성의 차이

  1. 인스턴스 속성 (Instance Variables):

    • 인스턴스 속성은 객체가 생성될 때마다 각각의 객체에 바인딩되는 속성입니다.
    • 예를 들어, xyRectangle 클래스에서 __init__ 메서드를 통해 각 객체에 할당됩니다. 각 객체마다 고유한 값이 할당되기 때문에 객체를 통해 접근해야 합니다.
  2. 클래스 속성 (Class Variables):

    • 클래스 속성은 모든 객체에서 공유되는 속성입니다. 클래스 자체에 바인딩되며, 모든 인스턴스가 같은 값을 공유합니다.
    • 클래스 이름을 통해 접근할 수 있습니다. 예를 들어, Rectangle.x처럼 클래스 이름을 통해 접근할 수 있습니다.

문제의 코드

class Point:
    def __init__(self, x, y):
        self.x = x  # 인스턴스 속성
        self.y = y  # 인스턴스 속성

class Rectangle(Point):
    def __init__(self, x, y):
        super().__init__(x, y)  # 부모 클래스(Point)의 __init__ 호출로 x, y 설정

r = Rectangle(1, 2)

위의 코드에서 Rectangle 클래스는 Point 클래스를 상속받고 있습니다. Point 클래스에서 xy는 인스턴스 속성으로 설정되어 있습니다. Rectangle 객체인 r을 생성할 때, r.xr.y는 객체 r에 할당된 속성입니다.

Rectangle.x가 작동하지 않는 이유

print(Rectangle.x)  # 오류 발생

위 코드는 오류가 발생합니다. 그 이유는 xRectangle 클래스의 인스턴스 속성이기 때문입니다. x는 객체가 생성될 때마다 각 인스턴스에 할당되므로, 클래스 이름인 Rectangle을 통해 접근할 수 없습니다.

해결 방법: 인스턴스를 통해 접근

인스턴스 속성에 접근하려면, 해당 객체를 통해 접근해야 합니다. 예를 들어, r.x와 같이 객체를 사용하여 속성에 접근할 수 있습니다.

print(r.x)  # 1

클래스 속성으로 변경

만약 x를 클래스 속성으로 설정하고 싶다면, Rectangle 클래스 내에서 x를 클래스 속성으로 정의할 수 있습니다. 이렇게 하면 Rectangle.x와 같이 클래스 이름을 통해 접근할 수 있습니다.

class Rectangle(Point):
    x = 0  # 클래스 속성

    def __init__(self, x, y):
        super().__init__(x, y)
        Rectangle.x = x  # x 값을 클래스 속성으로 설정

r = Rectangle(1, 2)
print(Rectangle.x)  # 1

결론

  • 인스턴스 속성은 객체를 통해 접근해야 하며, 클래스 이름으로는 접근할 수 없습니다. r.x와 같은 방식으로 객체에서 접근해야 합니다.
  • 클래스 속성은 클래스 자체에서 공유되는 값이므로, Rectangle.x와 같은 방식으로 클래스 이름을 통해 접근할 수 있습니다.

이러한 개념을 이해하면, 객체 지향 프로그래밍에서 발생할 수 있는 다양한 오류를 예방할 수 있습니다.

0개의 댓글