
파이썬 property는 메서드처럼 값을 계산하면서도 사용하는 쪽에서는 변수처럼 읽게 해 주는 문법입니다. 그래서 API를 크게 바꾸지 않고 내부 구현을 조정할 때 유용합니다.
핵심은 호출하는 코드에는 속성처럼 보이지만, 클래스 내부에는 계산과 검증을 숨길 수 있다는 점입니다. 이 글은 Python 공식 descriptor와 property 문서를 기준으로 @property 사용 기준을 정리합니다.

파이썬 property를 먼저 한 줄로 정리하면
property는 메서드를 속성처럼 접근하게 만드는 기능입니다. 함수 호출 괄호 없이 `obj.area`처럼 읽지만, 내부에서는 계산 로직이 실행될 수 있습니다.
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
@property
def area(self):
return self.width * self.height사용자는 `rect.area`를 값처럼 읽습니다. 하지만 실제 값은 width와 height를 바탕으로 매번 계산됩니다.
메서드보다 property가 자연스러운 경우
값을 가져오는 행위가 객체의 자연스러운 속성처럼 읽힌다면 property가 어울립니다. 넓이, 나이, 총액, 상태 이름처럼 외부에서 볼 때 값으로 느껴지는 대상입니다.
반대로 네트워크 요청, 파일 저장, 시간이 오래 걸리는 계산처럼 행동의 느낌이 강한 작업은 메서드가 더 정직합니다. 속성 접근이 너무 무거우면 읽는 사람이 비용을 예상하기 어렵습니다.
setter는 검증이 필요할 때만 둔다
property setter를 쓰면 값을 대입하는 순간 검증 로직을 실행할 수 있습니다.
class Temperature:
def __init__(self, celsius):
self.celsius = celsius
@property
def celsius(self):
return self._celsius
@celsius.setter
def celsius(self, value):
if value < -273.15:
raise ValueError("absolute zero보다 낮을 수 없습니다")
self._celsius = value이런 setter는 의미가 있습니다. 값이 들어올 때 객체의 규칙을 지켜야 하기 때문입니다.
getter setter를 Java처럼 만들 필요는 없다
Python에서는 단순히 필드를 감싸기 위해 `get_name`, `set_name`을 무조건 만들 필요가 없습니다. 공개해도 되는 단순 데이터라면 속성을 그대로 쓰는 편이 더 읽기 쉽습니다.
# 과한 방식
user.get_name()
# Python에서 더 자연스러운 방식
user.name나중에 검증이나 계산이 필요해지면 property로 바꾸어도 호출 코드는 user.name 형태를 유지할 수 있습니다. 이것이 Python property의 실용적인 장점입니다.
property 남용을 피해야 하는 경우
- 속성 접근처럼 보이지만 내부에서 오래 걸리는 작업을 한다
- 매번 외부 API나 데이터베이스를 호출한다
- 읽을 때마다 객체 상태가 바뀐다
- 예외가 자주 발생하는 복잡한 행동을 숨긴다
- 단순 필드를 감싸기 위해 getter/setter를 반복 생성한다
실무 체크리스트
- 외부에서 값처럼 읽히는 개념인지 먼저 확인한다
- 계산 비용이 작고 예측 가능한지 본다
- setter는 검증 규칙이 있을 때만 둔다
- 부작용이 있는 작업은 property보다 메서드로 남긴다
- 호출 코드 호환성을 유지해야 할 때 property 전환을 고려한다
정리
파이썬 property를 이해할 때는 문법 자체보다 코드가 표현하려는 경계를 먼저 보는 편이 좋습니다. 오늘 글의 기준은 ‘읽는 사람이 실수를 줄일 수 있는가’입니다.
함께 보면 좋은 내부 글은 파이썬 dataclass는 왜 쓸까, 파이썬 list comprehension은 언제 읽기 어려워질까, 파이썬 예외 처리는 어디까지 잡아야 할까입니다. 외부 기준은 Python Docs – built-in property, Python Docs – Descriptor HowTo Guide, Python Docs – Classes를 확인했습니다.