Python 강좌 / 메서드·프로퍼티로 객체의 동작 관리하기
메서드는 객체의 동작을 정의하고 property는 속성 접근 형태를 유지하면서 읽기·쓰기 규칙을 적용합니다. 값을 바꿀 때도 유효성을 유지해야 한다면 대입 경로를 일관되게 관리할 수 있습니다.
일반 속성과 프로퍼티의 차이
amount라는 공개 인터페이스를 유지하면서 내부에는 _amount를 저장합니다. 밑줄은 내부 구현이라는 관례이며 외부 접근을 보안상 차단하는 장치는 아닙니다. 프로퍼티를 만들었다고 비밀 데이터가 안전하게 숨겨지는 것은 아닙니다.
관련 동작과 지원 조건은 메서드·프로퍼티로 객체의 동작 관리하기 관련 공식 문서에서 확인할 수 있습니다.
검증은 생성과 이후 변경에 모두 적용되어야 합니다. __init__에서 self.amount로 대입하면 setter를 거치므로 초기 상태도 같은 규칙을 따를 수 있습니다.
전체 예제와 실행 결과
별도의 실습 폴더에서 아래 파일을 UTF-8로 저장합니다. 가상환경을 선택한 터미널에서 python properties.py 명령으로 실행합니다. macOS·Ubuntu에서 가상환경을 사용하지 않는 경우 명령 이름을 python3으로 바꿉니다.
properties.py 파일의 전체 내용입니다.
class Expense:
def __init__(self, amount):
self.amount = amount
@property
def amount(self):
return self._amount
@amount.setter
def amount(self, value):
if type(value) is not int or value < 0:
raise ValueError("amount must be a nonnegative integer")
self._amount = value
def add_fee(self, fee):
self.amount = self.amount + fee
item = Expense(8000)
item.add_fee(500)
print(item.amount)
try:
item.amount = -1
except ValueError:
print("rejected")
print(item.amount)
예상 결과는 다음과 같습니다.
8500 rejected 8500
재귀 호출과 부분 변경 피하기
setter 안에서 self.amount = value를 쓰면 자기 setter를 다시 호출하는 재귀가 생깁니다. 내부 저장소 _amount에 대입해야 합니다. 검증을 먼저 하고 실제 상태 변경을 나중에 해야 실패 시 기존 값이 유지됩니다.
프로퍼티에 네트워크 요청이나 큰 파일 처리를 숨기면 단순 속성 조회처럼 보이는 작업이 비싸거나 실패할 수 있습니다. 눈에 띄는 작업은 명시적인 메서드로 드러내는 편이 읽기 쉽습니다.
호출 가능한 메서드와 읽기 전용 값
setter를 정의하지 않으면 해당 프로퍼티는 일반적인 대입 경로에서 읽기 전용으로 사용할 수 있습니다. 이것은 객체 전체가 불변이라는 의미는 아닙니다. property와 일반 메서드 중 선택할 때는 값의 조회·설정인지, 별도 작업 수행인지 구분합니다.
- amount에 True와 3.5를 각각 넣어 정수 정책이 거부하는지 확인합니다.
- 실패 후 값이 8500인지 확인합니다.
- fee가 음수여도 결과 금액이 유효하면 허용할지 업무 규칙을 정하고 메서드 자체의 검증을 추가할지 판단합니다.




