파이썬의 모든 것은 객체다
파이썬에서는 모든 것이 객체(object)입니다. 그리고 모든 객체는 속성(attribute)과 메서드(method) 또는 함수를 가지고 있습니다. 속성은 객체가 담고 있는 데이터를 나타내는 변수로, 예를 들어 name(이름), age(나이), height(키) 같은 값들이 여기에 해당합니다.
프로퍼티란 무엇인가?
프로퍼티(property)는 특수한 종류의 속성으로, getter·setter·deleter 역할을 하는 __get__, __set__, __delete__ 메서드를 가지고 있습니다. 즉, 프로퍼티는 단순한 데이터 저장소가 아니라 값을 읽거나 설정하거나 삭제하는 순간에 특정 로직이 실행되도록 설계된 속성입니다.
파이썬에는 property() 함수와 @property 데코레이터가 기본으로 제공되기 때문에, 별도의 라이브러리 없이도 속성에 대한 getter/setter 접근을 손쉽게 구현할 수 있습니다.
파이썬은 프로퍼티를 어떻게 인식할까?
파이썬이 다음과 같은 코드를 실행한다고 가정해 보겠습니다.
foo = SomeObject()
print(foo.bar)
파이썬은 먼저 foo 안에서 bar를 찾은 뒤, 해당 객체에 __get__, __set__, __delete__ 메서드가 정의되어 있는지 검사합니다. 만약 이러한 메서드가 존재한다면 bar는 프로퍼티입니다. 이 경우 파이썬은 단순히 bar 객체 자체를 반환하는 대신 __get__ 메서드를 호출하고, 그 메서드가 반환하는 값을 최종 결과로 돌려줍니다.
@property 데코레이터로 getter, setter, deleter 구현하기
파이썬에서는 property() 함수를 사용해 getter, setter, deleter를 정의할 수 있습니다. 읽기 전용 프로퍼티만 필요하다면 메서드 위에 @property 데코레이터 하나만 붙이면 됩니다.
class C(object):
def __init__(self):
self._x = None # _x는 일반 속성(attribute)
@property
def x(self):
"""'x' 프로퍼티입니다."""
return self._x # getter 메서드
@x.setter
def x(self, value): # setter 메서드
self._x = value
@x.deleter
def x(self): # deleter 메서드
del self._x
핵심 정리
속성(Attribute)은 객체에 저장된 데이터 그 자체이고, 프로퍼티(Property)는 접근 시점에 getter/setter/deleter 로직이 실행되는 특수한 형태의 속성입니다.
프로퍼티를 활용하면 내부 변수를 외부에 직접 노출하지 않으면서도(캡슐화), 값을 읽거나 설정할 때 유효성 검사나 로깅 같은 부가적인 처리를 자연스럽게 수행할 수 있습니다. 이는 자바 등 다른 언어에서 getter/setter 메서드를 일일이 작성하는 방식보다 훨씬 간결하고 파이썬다운(Pythonic) 코드 작성을 가능하게 해 줍니다.