특히, 클래스 내부의 속성(데이터)이 외부에서 직접 변경될 경우, 원하지 않는 값이 설정되어 프로그램이 예상치 못한 동작을 할 수 있습니다. 이를 방지하기 위해 Getter(게터)와 Setter(세터) 를 사용합니다.
Getter와 Setter는 클래스 내부의 private(비공개) 속성에 접근하거나 값을 변경하는 메서드입니다. 이를 활용하면 데이터를 안전하게 보호하면서도 필요한 경우 외부에서 값을 읽고 수정할 수 있도록 허용할 수 있습니다.
Getter & Setter를 사용해야 하는 이유
데이터 보호: 직접 속성에 접근하는 것을 방지하고, 유효한 값만 설정되도록 제한할 수 있습니다.
내부 구현 변경 가능: 클래스 내부 구조가 변경되더라도 Getter와 Setter를 통해 외부 코드의 영향을 최소화할 수 있습니다.
유효성 검사: 올바르지 않은 값이 설정되지 않도록 검증하는 로직을 추가할 수 있습니다.
Getter & Setter를 사용하지 않은 경우
class BankAccount:
def __init__(self, initial_balance):
self.balance = initial_balance # balance 속성을 직접 설정
# 사용 예시
account = BankAccount(100)
account.balance = -50 # 부정확한 값 입력 가능
위 코드에서는 balance 속성이 직접 접근 가능하기 때문에 잘못된 값(-50)을 설정할 수 있습니다. 은행 계좌의 잔액이 음수가 되는 것은 비정상적인 상황이므로, 이를 방지할 필요가 있습니다.
Getter & Setter 사용하기
Python에서는 @property 데코레이터를 활용하여 좀 더 파이썬다운 방식(Pythonic way) 으로 Getter와 Setter를 구현할 수 있습니다.
class BankAccount:
def __init__(self, initial_balance):
self._balance = None # 비공개 속성
self.balance = initial_balance # Setter 호출
@property
def balance(self):
"""
Getter 메서드: balance 값을 반환하는 역할을 합니다.
`@property` 데코레이터를 사용하면 메서드를 속성처럼 접근할 수 있습니다.
예: account.balance (괄호 없이 호출 가능)
"""
return self._balance # Getter 역할
@balance.setter
def balance(self, new_balance):
"""
Setter 메서드: balance 값을 설정하는 역할을 합니다.
`@balance.setter` 데코레이터를 사용하면 속성을 직접 할당하는 것처럼 값을 설정할 수 있습니다.
예: account.balance = 200
"""
if new_balance < 0:
raise ValueError("잔액은 0보다 작을 수 없습니다!")
self._balance = new_balance # Setter 역할
# 사용 예시
account = BankAccount(100)
print(account.balance) # 100 출력
account.balance = -50 # ValueError 발생: 잔액은 0보다 작을 수 없습니다!
✅ @property와 @balance.setter의 역할
@property: 메서드를 속성처럼 사용할 수 있도록 변환해줍니다. 즉, account.balance() 대신 account.balance처럼 호출할 수 있습니다.
@balance.setter: 속성 값을 설정할 때 특정 로직(유효성 검사 등)을 추가할 수 있도록 합니다. 이 경우, account.balance = 값을 할당할 때 Setter 메서드가 실행됩니다.
이제 balance 속성을 직접 수정할 수 없으며, 반드시 Setter를 통해 값을 변경해야 합니다. 즉, 데이터 무결성을 유지할 수 있습니다.
반응형
마무리
Getter와 Setter를 사용하면 클래스 내부 데이터를 안전하게 보호하고, 데이터를 변경할 때 유효성 검사를 적용할 수 있습니다. 특히, 중요한 데이터를 다루는 경우(예: 은행 계좌, 사용자 정보 등)에는 반드시 Getter와 Setter를 활용하는 것이 좋습니다.
💡 사용자가 직접 데이터를 수정하게 두는 것은 아기에게 자동차 키를 맡기는 것과 같습니다! 🏎️💨