여기 Rectangle.x가 작동하지 않는 이유와 관련된 포스팅을 작성해 보았습니다.
Rectangle.x 왜 안 될까?파이썬에서 객체지향 프로그래밍을 할 때, 클래스 속성과 인스턴스 속성의 개념을 이해하는 것은 매우 중요합니다. 특히, 클래스 속성과 인스턴스 속성의 차이를 잘 이해해야 코드에서 발생할 수 있는 오류를 방지할 수 있습니다. 이번 포스팅에서는 Rectangle.x와 같은 접근이 왜 제대로 작동하지 않는지, 그리고 그 이유를 설명하려고 합니다.
인스턴스 속성 (Instance Variables):
x와 y는 Rectangle 클래스에서 __init__ 메서드를 통해 각 객체에 할당됩니다. 각 객체마다 고유한 값이 할당되기 때문에 객체를 통해 접근해야 합니다.클래스 속성 (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와 같은 방식으로 클래스 이름을 통해 접근할 수 있습니다.이러한 개념을 이해하면, 객체 지향 프로그래밍에서 발생할 수 있는 다양한 오류를 예방할 수 있습니다.