Python 강좌 / 메서드·프로퍼티로 객체의 동작 관리하기
메서드는 객체의 동작을 정의하고 property는 속성 접근 형태를 유지하면서 읽기·쓰기 규칙을 적용합니다. 값을 바꿀 때도 유효성을 유지해야 한다면 대입 경로를 일관되게 관리할 수 있습니다.
일반 속성과 프로퍼티의 차이
amount라는 공개 인터페이스를 유지하면서 내부에는 _amount를 저장합니다. 밑줄은 내부 구현이라는 관례이며 외부 접근을 보안상 차단하는 장치는 아닙니다. 프로퍼티를 만들었다고 비밀 데이터가 안전하게 숨겨지는 것은 아닙니다.
관련 동작과 지원 조건은 Python: functions에서 확인할 수 있습니다.
검증은 생성과 이후 변경에 모두 적용되어야 합니다. __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에 대입해야 합니다. 검증을 먼저 하고 실제 상태 변경을 나중에 해야 실패 시 기존 값이 유지됩니다.
프로퍼티에 네트워크 요청이나 큰 파일 처리를 숨기면 단순 속성 조회처럼 보이는 작업이 비싸거나 실패할 수 있습니다. 눈에 띄는 작업은 명시적인 메서드로 드러내는 편이 읽기 쉽습니다.
obj.amount를 읽으면 getter, obj.amount = value로 쓰면 setter가 호출됩니다. @property는 이 접근 규칙을 정의하는 장식자이며 호출할 때 괄호를 붙이지 않습니다. setter에서는 검증을 마친 뒤 별도 저장 속성인 _amount에 대입합니다. setter 안에서 다시 self.amount에 대입하면 같은 setter를 재귀 호출합니다.
| 항목 | 동작 |
|---|---|
| obj.amount | getter 호출 |
| obj.amount = 100 | setter 검증 후 _amount 저장 |
호출 가능한 메서드와 읽기 전용 값
setter를 정의하지 않으면 해당 프로퍼티는 일반적인 대입 경로에서 읽기 전용으로 사용할 수 있습니다. 이것은 객체 전체가 불변이라는 의미는 아닙니다. property와 일반 메서드 중 선택할 때는 값의 조회·설정인지, 별도 작업 수행인지 구분합니다.
- amount에 True와 3.5를 각각 넣어 정수 정책이 거부하는지 확인합니다.
- 실패 후 값이 8500인지 확인합니다.
- fee가 음수여도 결과 금액이 유효하면 허용할지 업무 규칙을 정하고 메서드 자체의 검증을 추가할지 판단합니다.




