|

파이썬 property는 왜 쓸까: 메서드처럼 계산하고 변수처럼 읽는 방법

파이썬 property 계산 속성 대표 이미지
property는 메서드로 계산하되 사용하는 쪽에서는 속성처럼 읽게 해 주는 장치입니다.

파이썬 property는 메서드처럼 값을 계산하면서도 사용하는 쪽에서는 변수처럼 읽게 해 주는 문법입니다. 그래서 API를 크게 바꾸지 않고 내부 구현을 조정할 때 유용합니다.

핵심은 호출하는 코드에는 속성처럼 보이지만, 클래스 내부에는 계산과 검증을 숨길 수 있다는 점입니다. 이 글은 Python 공식 descriptor와 property 문서를 기준으로 @property 사용 기준을 정리합니다.

파이썬 property 사용 기준 요약 카드
property는 모든 getter를 꾸미는 장식이 아니라, 읽는 쪽의 모델을 안정적으로 유지하는 도구입니다.

파이썬 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를 반복 생성한다

실무 체크리스트

  1. 외부에서 값처럼 읽히는 개념인지 먼저 확인한다
  2. 계산 비용이 작고 예측 가능한지 본다
  3. setter는 검증 규칙이 있을 때만 둔다
  4. 부작용이 있는 작업은 property보다 메서드로 남긴다
  5. 호출 코드 호환성을 유지해야 할 때 property 전환을 고려한다

정리

파이썬 property를 이해할 때는 문법 자체보다 코드가 표현하려는 경계를 먼저 보는 편이 좋습니다. 오늘 글의 기준은 ‘읽는 사람이 실수를 줄일 수 있는가’입니다.

함께 보면 좋은 내부 글은 파이썬 dataclass는 왜 쓸까, 파이썬 list comprehension은 언제 읽기 어려워질까, 파이썬 예외 처리는 어디까지 잡아야 할까입니다. 외부 기준은 Python Docs – built-in property, Python Docs – Descriptor HowTo Guide, Python Docs – Classes를 확인했습니다.

함께보면 좋은 글