[Python/Java] 객체지향, 캡슐화(Encapsulation)

2025. 12. 20. 19:40·ProgrammingLanguages

객체 지향 프로그래밍의 중요한 개념인 캡슐화! 

 

캡슐화란?

 

클래스의 메소드와 변수를 외부에서 함부로 조작하지 못하도록 감싸고 제한하는 기능입니다.

(java 같은 경우, private 이라는 키워드를 통해 클래스 내부의 속성에 대해 외부에서 접근하는 것을 제한할 수 있지만 파이썬은 없음.)

그래서 캡슐화로 클래스 내부의 멤버 값을 보호합니다.

https://logicmojo.com/encapsulation-in-oops

 

내부(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
'ProgrammingLanguages' 카테고리의 다른 글
  • [Python] with 문의 핵심, 컨텍스트 매니저(Context Manager)
yeseul-kim01
yeseul-kim01
  • yeseul-kim01
    슬 개발일지
    yeseul-kim01
  • 전체
    오늘
    어제
    • 분류 전체보기 (79)
      • 자격증 (1)
        • 정보보안기사 (0)
      • DevOps (17)
        • Docker (6)
        • Kubernetes (1)
        • GitHub Actions (0)
        • AWS (4)
        • Monitoring (1)
        • Nginx (1)
        • GCP (3)
      • ServerDev (34)
        • SpringBoot (13)
        • DJango (5)
        • FastAPI (14)
        • Next (0)
        • Flask (0)
        • Database (2)
      • Algorithm (2)
        • BFS (0)
        • DFS (1)
        • 다익스트라 (0)
      • CS (8)
      • Data Engineering (1)
      • AI&MLOps (2)
      • Architecture (6)
      • Software Engineering (0)
        • Library Packaging (0)
      • Project (5)
        • docx-generator (0)
        • speak-note (2)
        • ms-serving (1)
        • keyshield (2)
      • ProgrammingLanguages (3)
        • Python (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    아키텍처
    di
    MLops
    rag
    KServe
    하이브리드아키텍처
    docker
    Django
    실무일기-백엔드편
    프로젝트기록-KeyShield
    프로젝트기록-speaknote
    멀티모듈
    SpeakNote
    Kubernetes
    multipartfile
    아키텍처설계
    SpringBoot
    실무일기-인프라편
    STT
    depends
    비동기처리
    FastAPI - CORS 마스터
    FastAPI
    grpc
    백엔드
    NLP부트캠프
    KeyShield
    실시간시스템
    동시성제어
    트러블슈팅
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
yeseul-kim01
[Python/Java] 객체지향, 캡슐화(Encapsulation)
상단으로

티스토리툴바