객체 지향 프로그래밍의 중요한 개념인 캡슐화!
캡슐화란?
클래스의 메소드와 변수를 외부에서 함부로 조작하지 못하도록 감싸고 제한하는 기능입니다.
(java 같은 경우, private 이라는 키워드를 통해 클래스 내부의 속성에 대해 외부에서 접근하는 것을 제한할 수 있지만 파이썬은 없음.)
그래서 캡슐화로 클래스 내부의 멤버 값을 보호합니다.

내부(Data & Methods)
알약 안에는 클래스의 속성(데이터)과 기능(메소드)이 함께 묶여 보호되고 있음을 보여줌.
외부(Controlled Access)
외부에서는 알약 내부의 복잡한 구성 요소를 직접 건드리는 것이 아니라, 정해진 인터페이스를 통해서만 소통할 수 있다는 점을 강조.
1. Python
클래스 내부에서 사용하는 보호할 필요가 있는 멥버 변수를 "_" 나 "__"로 시작하도록 선언
이렇게 선언된 애들을 private 한 멤버로 취급. 하지만 , .__로 접근 자체는 할 수 있어서 , 접근하는 코드를 사용하지 않도록 짜줘야 한다.
(Setter 와 Getter) 세터와 게터 함수를 만들어서 내부에서 if 문으로 제한을 두면 됨. 외부에 공개하고 싶지 않은 private 함수에다가 set,get을 붙여 속성에 접근할 수 있게 해준다.
2. Java
자바같은 경우, private을 걸어두면 아예 접근이 불가능합니다. (setter , getter 를 달 수 있음.)
두개의 차이점은 Python 같은 경우 일종의 경고이고, Java는 그냥 접근 자체를 못한다!
Python에서의 캡슐화 실습
파이썬은 __를 사용하여 변수명을 숨기고, Getter와 Setter를 통해 값에 접근함.
class Member:
def __init__(self, name, age):
self.name = name
self.__age = age # __를 붙여 private하게 취급
# Getter: 나이를 조회할 때 사용
def get_age(self):
return self.__age
# Setter: 나이를 설정할 때 유효성 검사 추가
def set_age(self, value):
if value < 0:
print("나이는 0보다 작을 수 없습니다.")
else:
self.__age = value
user = Member("Gemini", 25)
# 잘못된 접근 방식
# print(user.__age) <- 에러 발생
# 올바른 접근 방식 (Setter 사용)
user.set_age(-5) # 출력: 나이는 0보다 작을 수 없습니다.
user.set_age(30) # 정상 변경
백엔드 실무 활용은 어떻게?
백엔드 서버 개발 시 캡슐화는 데이터의 무결성(Data Integrity)을 위해 필수임.
① 계좌 출금 시스템 (Business Logic)
사용자의 잔액을 누구나 직접 수정할 수 있다면 큰 사고가 나기 때문에
캡슐화를 통해 오직 withdraw() 함수를 통해서만 잔액이 줄어들게 만들어야 한다.
class Wallet:
def __init__(self, balance):
self.__balance = balance
def withdraw(self, amount):
if amount > self.__balance:
raise Exception("잔액이 부족합니다.")
self.__balance -= amount
return self.__balance
② 비밀번호 저장 (Security)
회원가입 시 비밀번호를 그대로 저장하지 않고, Setter 내부에서 해싱(암호화)을 거치도록 강제할 수 있음.
외부에선 단순히 값을 넣는 것 같지만 내부적으론 보안 처리가 일어나는 것
왜 파이썬은 억지로 안 막나요?
파이썬은 "접근을 막는 것보다, 잘못된 접근을 하지 않도록 좋은 인터페이스를 제공하는 것"이 더 중요함.
개발자가 억지로 _Member__age를 써서 값을 바꾼다면, 그로 인해 발생하는 버그의 책임은 전적으로 개발자에게 있다는 실용주의적 태도를 보여서
'ProgrammingLanguages' 카테고리의 다른 글
| [Python] with 문의 핵심, 컨텍스트 매니저(Context Manager) (0) | 2025.12.17 |
|---|