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

Yeeun·2025년 4월 30일

Python

목록 보기
29/31

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


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

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

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

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

    • 인스턴스 속성은 객체가 생성될 때마다 각각의 객체에 바인딩되는 속성입니다.
    • 예를 들어, x와 y는 Rectangle 클래스에서 __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 클래스에서 x와 y는 인스턴스 속성으로 설정되어 있습니다. Rectangle 객체인 r을 생성할 때, r.x와 r.y는 객체 r에 할당된 속성입니다.

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

print(Rectangle.x)  # 오류 발생

위 코드는 오류가 발생합니다. 그 이유는 x가 Rectangle 클래스의 인스턴스 속성이기 때문입니다. 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개의 댓글