파이썬 - 캡슐화: 초보자 가이드
안녕하세요, 미래의 파이썬 마법사 여러분! 오늘은 마법의 세계, 캡슐화에 빠지러 가요. 이 단어가 해리 포터의 마법처럼 들리也不要担心. 이 수업이 끝날 때까지, 여러분은 이 개념을 숙련된 마법사처럼 사용할 수 있을 거예요!
캡슐화란 무엇인가요?
캡슐화는 자물쇠가 달린 비밀 일기장과 비슷해요. 데이터(일기장에 쓰인 내용)와 해당 데이터에 작용하는 메서드(일기장에 쓰는 행위)를 단일한 단위로 묶고, 그 데이터에 대한 접근을 제어하는 방법이에요. 파이썬에서는 클래스를 사용하여 이를 구현해요.
簡単한 예제를 시작해볼게요:
class Diary:
def __init__(self):
self.entries = []
def add_entry(self, entry):
self.entries.append(entry)
def get_entries(self):
return self.entries
my_diary = Diary()
my_diary.add_entry("Dear Diary, today I learned about encapsulation!")
print(my_diary.get_entries())
이 예제에서, Diary
는 우리의 클래스예요. 그것은 비밀 속성 entries
(우리의 비밀 일기장 내용)과 두 가지 메서드를 가지고 있어요. 이것은 캡슐화가 진행 중인 것입니다!
파이썬에서 캡슐화 구현하기
Private Attributes
파이썬에서는 언더스코어를 접두사로 사용하여 속성을 프라이빗으로 나타내는 관행이 있어요:
class Diary:
def __init__(self):
self._entries = [] # 언더스코어에 주목하세요
def add_entry(self, entry):
self._entries.append(entry)
def get_entries(self):
return self._entries.copy() # 원본을 보호하기 위해 복사를 반환합니다
my_diary = Diary()
my_diary.add_entry("I love Python!")
print(my_diary.get_entries())
# 이것은 작동하지만 권장하지 않습니다:
print(my_diary._entries)
언더스코어는 다른 프로그래머에게 "이것은 프라이빗이에요! 직접 만지지 마세요!"라고 알려줍니다. 하지만 파이썬에서는 그냥 성인의 약속일 뿐입니다 - 여전히 접근할 수 있지만, 접근하지 말아야 해요.
Property Decorators
더 많은 제어를 위해 프로퍼티 데코레이터를 사용할 수 있어요. 그들은 우리의 속성을 마법의 경비대로 합니다:
class Diary:
def __init__(self):
self._entries = []
def add_entry(self, entry):
self._entries.append(entry)
@property
def entries(self):
return self._entries.copy()
my_diary = Diary()
my_diary.add_entry("Properties are cool!")
print(my_diary.entries) # 이것은 작동합니다
# my_diary.entries = [] # 이것은 에러를 일으킵니다
@property
데코레이터는 entries
를 속성처럼 접근할 수 있게 하지만, 실제로는 배후에서 메서드를 호출하고 있어요. 이를 통해 데이터에 대한 접근을 더 많이 제어할 수 있어요.
Setters and Getters
때로는 속성의 조절된 수정을 허용하고 싶을 때가 있어요. 세터를 입력하세요:
class Diary:
def __init__(self):
self._entries = []
def add_entry(self, entry):
self._entries.append(entry)
@property
def entries(self):
return self._entries.copy()
@entries.setter
def entries(self, new_entries):
if isinstance(new_entries, list):
self._entries = new_entries
else:
raise ValueError("Entries must be a list")
my_diary = Diary()
my_diary.entries = ["Day 1", "Day 2"] # 이제 이것은 작동합니다
print(my_diary.entries)
my_diary.entries = "Not a list" # 이것은 에러를 일으킵니다
이제 entries
를 직접 설정할 수 있지만, 리스트일 때만 설정할 수 있어요. 우리의 일기장이 매우 정교해지고 있어요!
캡슐화를 사용하는 이유는 무엇인가요?
- 데이터 보호: 데이터의 실수로 인한 수정을 방지합니다.
- 유연성: 내부 구현을 변경해도 외부 코드에 영향을 주지 않습니다.
- 제어: 데이터가 어떻게 접근되고 수정되는지 결정합니다.
누구나 허락 없이 일기장에 그림을 그릴 수 있다면 어떻겠어요? 캡슐화는 things을 깔끔하고 안전하게 유지해줍니다.
고급 캡슐화 기술
이름 맹글링
정말로 무엇을 사생하고 싶을 때, 파이썬은 이름 맹글링을 제공합니다:
class SuperSecretDiary:
def __init__(self):
self.__ultra_private = "My deepest secrets"
def reveal_secrets(self):
return self.__ultra_private
diary = SuperSecretDiary()
print(diary.reveal_secrets()) # 이것은 작동합니다
# print(diary.__ultra_private) # 이것은 AttributeError를 일으킵니다
print(diary._SuperSecretDiary__ultra_private) # 이것은 작동하지만 권장하지 않습니다!
더블 언더스코어는 파이썬이 이름을 "맹글링"하여 외부에서 접근하기 어렵게 만듭니다. 하지만 불가능では 아닙니다.
프로퍼티를 사용한 캡슐화
더 복잡한 예제를 만들어볼게요 - 은행 계좌:
class BankAccount:
def __init__(self, initial_balance=0):
self._balance = initial_balance
@property
def balance(self):
return self._balance
@balance.setter
def balance(self, value):
if value < 0:
raise ValueError("Balance cannot be negative")
self._balance = value
def deposit(self, amount):
if amount <= 0:
raise ValueError("Deposit amount must be positive")
self.balance += amount
def withdraw(self, amount):
if amount <= 0:
raise ValueError("Withdrawal amount must be positive")
if amount > self.balance:
raise ValueError("Insufficient funds")
self.balance -= amount
account = BankAccount(1000)
print(account.balance) # 1000
account.deposit(500)
print(account.balance) # 1500
account.withdraw(200)
print(account.balance) # 1300
# account.balance = -500 # 이것은 ValueError를 일으킵니다
이 BankAccount
클래스는 잔고를 캡슐화하여 음수가 되지 않도록 하고, 예금과 인출이 유효하게 합니다.
캡슐화 메서드 표
메서드 | 설명 | 예제 |
---|---|---|
언더스코어 접두사 | 프라이빗 속성을 나타냄 | self._private_var |
프로퍼티 데코레이터 | 속성에 getter를 만듦 | @property |
세터 데코레이터 | 프로퍼티에 setter를 만듦 | @attribute.setter |
이름 맹글링 | 강력하게 프라이빗 속성을 만듦 | self.__very_private |
결론
캡슐화는 데이터를 책임지는 책임감 있는 경비원과 같아요. 비밀리기보다는 데이터가 주의 깊게 처리되었는지 확인하는 것이에요. 파이썬 여정을 계속하면, 캡슐화가 견고하고 유지보수하기 쉬운 코드를 작성하는 데 매우 가치 있는 도구라는 것을 깨닫게 될 거예요.
기억하세요, 어린 파이썬 마법사 여러분, 위대한 힘은 위대한 책임과 함께 옵니다. 캡슐화를 지혜롭게 사용하면, 코드가 여러분에게 감사하게 될 거예요!
이제 앞으로 나가 캡슐화를 사용해보세요! 그리고 파이썬에서 배우는 모든 멋진 것들을 (잘 보호된) 일기장에 적지 마세요. 코딩이 즐거워세요!
Credits: Image by storyset