본문 바로가기
카테고리 없음

파이썬 캡슐화와 데이터 은닉 - 객체지향 정보 보호 핵심

by chapter21 2025. 5. 25.

파이썬 캡슐화와 데이터 은닉 - 객체지향 정보 보호 핵심

파이썬에서 중요한 정보를 안전하게 보호하는 방법을 배우고 싶으신가요? 이번 시간에는 객체지향 프로그래밍의 핵심 개념인 데이터 은닉캡슐화에 대해 알아보겠습니다. 이 개념들은 마치 여러분의 일기장을 안전하게 잠그거나, 복잡한 기계의 내부를 보이지 않게 보호하는 것과 같습니다.

데이터를 안전하게 관리하는 방법을 이해하면, 여러분의 파이썬 프로그램은 더욱 튼튼하고 안정적으로 동작할 것입니다. 이 글을 통해 중요한 데이터를 보호하는 프로그래밍 습관을 기르게 될 것입니다.

데이터 은닉과 캡슐화, 왜 필요할까요?

여러분의 주머니에 소중한 물건(예: 용돈)이 있다고 상상해 보세요. 다른 사람이 함부로 그 용돈을 꺼내거나 멋대로 쓸 수 있다면 어떻게 될까요? 아마 곤란한 상황이 생길 것입니다. 프로그래밍에서도 마찬가지입니다.
우리가 만든 프로그램 속에는 아주 중요한 정보(데이터)들이 있습니다. 예를 들어, 은행 잔고, 개인 정보, 게임 점수 같은 것들이죠. 이런 데이터들을 아무나 쉽게 변경하거나 볼 수 있다면 문제가 발생할 수 있습니다.


캡슐화(Encapsulation)는 데이터와 그 데이터를 다루는 함수(메서드)를 하나의 '캡슐'처럼 묶는 것을 말합니다. 마치 장난감 상자에 장난감과 사용 설명서를 함께 넣어두는 것과 비슷합니다.
상자 안에 무엇이 있는지 보이지 않고, 상자 겉에 있는 버튼이나 조작법으로만 장난감을 다룰 수 있게 하는 것이죠.


데이터 은닉(Data Hiding)은 캡슐화의 한 부분으로, 이 '캡슐' 안에 있는 중요한 데이터를 외부에서 직접 보거나 변경하지 못하도록 숨기는 것입니다.
금고 속에 비밀번호를 넣어두고, 금고 문을 통해서만 비밀번호를 꺼내거나 변경할 수 있게 하는 것과 비슷합니다. 파이썬은 이런 데이터 은닉을 구현하는 몇 가지 방법을 제공합니다. 지금부터 함께 살펴보겠습니다.

예시 1: 단일 언더스코어 (_)로 '이건 내부용!' 약속하기

파이썬에서는 변수 이름 앞에 _ (언더스코어 하나)를 붙여서 '이 변수는 클래스 안에서만 쓰는 것이 좋으니, 밖에서는 직접 건드리지 마세요'라고 개발자들끼리 약속합니다. 이것은 강제적인 규칙이 아니라, 다른 개발자들에게 알려주는 일종의 '경고문' 같은 것입니다.

Python
# _를 사용하여 내부용 변수임을 나타냅니다. class Account: def __init__(self, balance): self._balance = balance # _balance는 내부용이라는 약속 def get_balance(self): return self._balance # 계좌 객체를 만듭니다. my_account = Account(10000) # 메서드를 통해 잔고를 확인합니다. print("현재 잔고 (메서드):", my_account.get_balance()) # _balance에 직접 접근해봅니다. (가능하지만 권장되지 않음) my_account._balance = 5000 print("변경된 잔고 (직접 접근):", my_account._balance)

위 코드를 실행하면 다음과 같은 결과가 화면에 나타납니다.

출력 결과
현재 잔고 (메서드): 10000
변경된 잔고 (직접 접근): 5000

보시다시피 _balance에 직접 접근해서 값을 변경할 수 있었습니다. 이것은 파이썬이 개발자들 간의 '약속'을 존중하는 방식이기 때문입니다.

예시 2: 이중 언더스코어 (__)로 '진짜 비밀이야!' 숨기기 (이름 맹글링)

변수 이름 앞에 __ (언더스코어 두 개)를 붙이면, 파이썬이 이 변수 이름을 자동으로 바꾸어 버립니다. 이것을 '이름 맹글링(Name Mangling)'이라고 부르는데, 외부에서 실수로 같은 이름의 변수를 만들어서 내부 변수와 겹치는 것을 막기 위한 기능입니다. 마치 비밀번호가 적힌 종이를 작은 글씨로 암호화해서 숨기는 것과 비슷합니다.

Python
# __를 사용하여 이름을 변경하여 숨깁니다. class SecretBox: def __init__(self, secret_value): self.__secret_code = secret_value # __secret_code는 숨겨진 변수 def reveal_secret(self): return self.__secret_code # 비밀 상자 객체를 만듭니다. my_box = SecretBox("PythonIsFun") # 메서드를 통해 비밀 코드를 확인합니다. print("비밀 코드 (메서드):", my_box.reveal_secret()) # __secret_code에 직접 접근 시도 (오류 발생 예상) try: print("비밀 코드 (직접 접근 시도):", my_box.__secret_code) except AttributeError as e: print("오류 발생:", e)

위 코드를 실행하면 다음과 같은 결과가 화면에 나타납니다.

출력 결과
비밀 코드 (메서드): PythonIsFun
오류 발생: 'SecretBox' object has no attribute '__secret_code'

이처럼 __를 붙인 변수는 외부에서 직접 접근할 수 없다는 오류 메시지가 나타납니다. 파이썬이 내부적으로 변수 이름을 _SecretBox__secret_code와 같이 바꾸었기 때문입니다.

예시 3: Getter와 Setter 메서드로 데이터 안전하게 관리하기

데이터를 숨겼다고 해서 아예 사용할 수 없는 것은 아닙니다. 우리는 특정 '통로'를 통해 데이터를 읽거나 변경할 수 있게 만들 수 있습니다. 이것이 바로 GetterSetter 메서드입니다. Getter는 데이터를 '얻어오는(Get)' 함수, Setter는 데이터를 '설정하는(Set)' 함수입니다. 마치 은행에서 통장 잔고를 '조회'하거나(Getter), '입금'하거나 '출금'하는(Setter) 것과 같습니다.

Python
# Getter와 Setter를 사용하여 데이터에 안전하게 접근합니다. class ProtectedAccount: def __init__(self, initial_balance): self.__balance = initial_balance # 잔고를 숨김 def get_balance(self): # 잔고를 얻는(Get) 메서드 return self.__balance def deposit(self, amount): # 돈을 입금하는(Set) 메서드 if amount > 0: self.__balance += amount print(f"{amount}원 입금되었습니다. 현재 잔고: {self.get_balance()}원") else: print("음수 금액은 입금할 수 없습니다.") def withdraw(self, amount): # 돈을 출금하는(Set) 메서드 if 0 < amount <= self.__balance: self.__balance -= amount print(f"{amount}원 출금되었습니다. 현재 잔고: {self.get_balance()}원") else: print("출금할 수 없습니다. 잔고를 확인하거나 유효한 금액을 입력하세요.") # 보호된 계좌 객체를 만듭니다. my_protected_account = ProtectedAccount(20000) # 잔고를 확인합니다. print("초기 잔고:", my_protected_account.get_balance()) # 돈을 입금하고 출금합니다. my_protected_account.deposit(5000) my_protected_account.withdraw(10000) my_protected_account.withdraw(20000) # 잔고보다 많은 금액 출금 시도

위 코드를 실행하면 다음과 같은 결과가 화면에 나타납니다.

출력 결과
초기 잔고: 20000
5000원 입금되었습니다. 현재 잔고: 25000원
10000원 출금되었습니다. 현재 잔고: 15000원
출금할 수 없습니다. 잔고를 확인하거나 유효한 금액을 입력하세요.

중요:

Getter와 Setter 메서드를 사용하면 데이터를 읽거나 변경하기 전에 조건을 검사하거나 다른 작업을 추가할 수 있어서, 데이터를 더욱 안전하고 규칙에 맞게 관리할 수 있습니다.

주의:

파이썬에서 __로 시작하는 변수도 완전히 접근할 수 없는 것은 아닙니다. `_클래스이름__변수이름` (예: `_ProtectedAccount__balance`) 형식으로 접근할 수는 있습니다. 하지만 이는 권장되지 않으며, 보통은 Getter/Setter와 같은 정해진 통로를 통해 접근해야 합니다. 핵심은 '약속'과 '규칙'을 지키는 것입니다.

핵심 : 캡슐화는 데이터와 메서드를 하나로 묶는 것이고, 데이터 은닉은 내부 데이터를 외부로부터 보호하는 것입니다. 파이썬에서는 _ (약속) 또는 __ (이름 맹글링)을 사용하여 이를 구현하고, Getter/Setter 메서드를 통해 데이터를 안전하게 관리합니다.

마무리 요약

이번 시간에는 파이썬에서 데이터를 안전하게 보호하는 방법인 데이터 은닉캡슐화에 대해 배웠습니다. ___의 차이점을 이해하고, Getter/Setter 메서드를 통해 데이터 접근을 제어하는 방법을 실습했습니다. 이 개념들은 여러분이 더 크고 안정적인 프로그램을 만드는 데 매우 중요한 기반이 될 것입니다. 다음 강의에서는 상속을 통해 기존 코드를 재사용하고 확장하는 객체지향의 또 다른 강력한 도구를 배워보겠습니다.

이 강의에 대한 질문이나 궁금한 점이 있다면 언제든지 댓글에 남겨주세요. 직접 코드를 작성하고 실행하며 개념을 익히는 것이 중요합니다!

다음 강의에서는 객체지향 프로그래밍의 '상속' 개념을 배워 봅니다.