객체 지향 프로그래밍(Object-Oriented Programming, OOP)의 핵심 개념 중 하나인 **캡슐화(Encapsulation)**는 객체의 내부 상태나 동작을 외부로부터 숨기고, 필요한 인터페이스만을 공개하여 객체의 무결성과 일관성을 유지하는 것을 의미합니다. 이를 통해 코드의 유지보수성과 재사용성을 향상시킬 수 있습니다.
class CreditCard:
MAX_PAYMENT_LIMIT = 30000000
def __init__(self, name, password, payment_limit):
self.name = name
self._password = password
self._payment_limit = payment_limit
@property
def password(self):
return "비밀번호는 볼 수 없습니다"
@password.setter
def password(self, new_password):
self._password = new_password
@property
def payment_limit(self):
return self._payment_limit
@payment_limit.setter
def payment_limit(self, new_payment_limit):
if 0 <= new_payment_limit <= CreditCard.MAX_PAYMENT_LIMIT:
self._payment_limit = new_payment_limit
else:
print("카드 한도는 0원 ~ 3천만 원 사이로 설정해 주세요!")
card = CreditCard("강영훈", "123", 100000)
print(card.name)
print(card.password)
print(card.payment_limit)
card.name = "성태호"
card.password = "1234"
card.payment_limit = -10
print(card.name)
print(card.password)
print(card.payment_limit)
주요 구현 사항:
- 비공개 속성(Private Attribute): _password와 _payment_limit은 언더스코어(_)로 시작하여 외부에서 직접 접근하지 않도록 의도하였습니다. 이는 속성의 직접적인 수정을 방지하고, 객체의 무결성을 유지하기 위함입니다.
- @property 데코레이터: password와 payment_limit 메서드에 적용하여, 해당 메서드를 속성처럼 사용할 수 있게 하였습니다. 이를 통해 내부 구현을 숨기면서도 외부에서는 직관적인 인터페이스를 제공합니다.
- Getter와 Setter 메서드: password와 payment_limit에 대해 각각 getter(property)와 setter를 정의하여, 속성 접근 시 추가적인 로직(예: 유효성 검사)을 수행할 수 있도록 하였습니다. 특히, payment_limit의 setter에서는 설정하려는 값이 0 이상 최대 한도 이하인지 확인하여, 유효한 값만을 허용하고 있습니다.
실행 결과:
강영훈
비밀번호는 볼 수 없습니다
100000
카드 한도는 0원 ~ 3천만 원 사이로 설정해 주세요!
성태호 비밀번호는 볼 수 없습니다
100000
설명:
- card 객체를 생성하고 초기 값을 설정하였습니다.
- card.name은 공개 속성이므로 직접 접근 및 수정이 가능합니다.
- card.password는 getter를 통해 "비밀번호는 볼 수 없습니다"라는 문자열을 반환하며, setter를 통해 비밀번호를 변경할 수 있습니다. 그러나 외부에서는 실제 비밀번호 값을 확인할 수 없습니다.
- card.payment_limit은 getter와 setter를 통해 접근하며, setter에서는 설정하려는 값의 유효성을 검사합니다. 예시에서 -10을 설정하려 했으나, 유효성 검사에 의해 거부되고 기존 값이 유지됩니다.
이러한 방식으로 캡슐화를 구현하면, 객체의 내부 상태를 보호하고, 잘못된 사용으로부터 객체를 안전하게 지킬 수 있습니다. 또한, 외부에는 필요한 인터페이스만을 공개하여 코드의 가독성과 유지보수성을 향상시킬 수 있습니다.
'파이썬 > 클래스와 객체 지향' 카테고리의 다른 글
인스턴스 메소드 vs 클래스 메소드 (0) | 2025.03.20 |
---|---|
[객체 지향 프로그래밍 4개의 기둥] 추상화를 통해 다형성을 구현하는 방법 (0) | 2025.03.18 |
[객체 지향 프로그래밍 4개의 기둥] 다형성 (0) | 2025.03.18 |
[객체 지향 프로그래밍 4개의 기둥] 캡슐화 그리고 프라이빗 메서드와 은닉화 (0) | 2025.03.18 |
불필요한 인스턴스 변수 사용 줄이기: 데이터프레임을 지역 변수로 처리하는 이유 (0) | 2025.03.18 |