파이썬 - 캡슐화: 초보자 가이드

안녕하세요, 미래의 파이썬 마법사 여러분! 오늘은 마법의 세계, 캡슐화에 빠지러 가요. 이 단어가 해리 포터의 마법처럼 들리也不要担心. 이 수업이 끝날 때까지, 여러분은 이 개념을 숙련된 마법사처럼 사용할 수 있을 거예요!

Python - Encapsulation

캡슐화란 무엇인가요?

캡슐화는 자물쇠가 달린 비밀 일기장과 비슷해요. 데이터(일기장에 쓰인 내용)와 해당 데이터에 작용하는 메서드(일기장에 쓰는 행위)를 단일한 단위로 묶고, 그 데이터에 대한 접근을 제어하는 방법이에요. 파이썬에서는 클래스를 사용하여 이를 구현해요.

簡単한 예제를 시작해볼게요:

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를 직접 설정할 수 있지만, 리스트일 때만 설정할 수 있어요. 우리의 일기장이 매우 정교해지고 있어요!

캡슐화를 사용하는 이유는 무엇인가요?

  1. 데이터 보호: 데이터의 실수로 인한 수정을 방지합니다.
  2. 유연성: 내부 구현을 변경해도 외부 코드에 영향을 주지 않습니다.
  3. 제어: 데이터가 어떻게 접근되고 수정되는지 결정합니다.

누구나 허락 없이 일기장에 그림을 그릴 수 있다면 어떻겠어요? 캡슐화는 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