본문 바로가기
Artificial Intelligence/60. Python

[PYTHON] 파이썬 정보 은닉의 정석 : Private 변수와 던더(__) 접두사의 심층 분석

by Papa Martino V 2026. 2. 19.
728x90
Private 변수와 던더(__) 접두사
Private 변수와 던더(__) 접두사

 

객체 지향 프로그래밍(OOP)의 4대 핵심 원칙 중 하나인 정보 은닉(Information Hiding)은 소프트웨어의 유지보수성과 안정성을 결정짓는 중요한 요소입니다. 자바(Java)나 C++ 같은 언어에서는 private 키워드를 통해 엄격하게 접근을 차단하지만, 파이썬은 조금 독특한 철학을 가지고 있습니다. 본 가이드에서는 파이썬에서 변수를 보호하는 메커니즘인 '네임 맹글링(Name Mangling)'과 밑줄 접두사의 실무적 활용법을 심도 있게 다룹니다.

1. 파이썬의 철학: "우리 모두는 성인이다"

파이썬의 창시자 귀도 반 로섬은 "We are all consenting adults here"라는 유명한 문장을 남겼습니다. 이는 언어 차원에서 강제적으로 접근을 막기보다, 개발자 간의 약속과 규약을 존중한다는 의미입니다. 그럼에도 불구하고 클래스 내부 데이터를 외부의 의도치 않은 수정으로부터 보호해야 할 필요는 반드시 존재합니다. 이를 위해 파이썬은 관례적인 밑줄(Understore) 기법을 제공합니다.

2. 변수 접두사에 따른 접근 수준 비교

파이썬에서 변수 앞에 붙는 밑줄의 개수는 해당 데이터의 성격을 규정합니다. 이를 명확히 구분하는 것이 전문적인 파이썬 코드를 작성하는 첫걸음입니다.

구분 표기법 (Syntax) 의미 및 가시성 외부 접근 가능 여부
Public variable 어디서든 자유롭게 접근 가능한 일반 변수 완전 허용
Protected _variable 내부용이라는 관례적 신호 (API 경고) 가능 (권장되지 않음)
Private __variable 네임 맹글링을 통한 이름 변경 및 보호 직접 접근 불가 (우회 필요)

3. 네임 맹글링(Name Mangling)의 동작 원리

변수명 앞에 두 개의 밑줄(__)을 붙이면 파이썬 인터프리터는 이를 _ClassName__variable 형태로 이름을 강제로 변환합니다. 이것이 바로 네임 맹글링입니다. 이는 단순히 이름을 숨기는 것뿐만 아니라, 서브클래스에서 동일한 이름의 변수를 선언했을 때 발생할 수 있는 '이름 충돌'을 방지하는 강력한 도구가 됩니다.

전문가 팁: 네임 맹글링은 보안을 위한 암호화 기술이 아닙니다. 개발자의 실수를 방지하고 클래스의 인터페이스를 명확히 하기 위한 구조적 장치로 이해해야 합니다.

4. 실무 코드 예제 (Sample Example)

다음은 은행 계좌 시스템을 모방하여 정보 은닉을 구현한 예제입니다. 잔액(balance)과 비밀번호(password)를 어떻게 보호하는지 확인해 보십시오.

예제: Account 클래스 설계
class BankAccount:
    def __init__(self, owner, balance, password):
        self.owner = owner            # Public
        self._account_type = "Basic"  # Protected (관례상 내부용)
        self.__balance = balance      # Private (네임 맹글링 적용)
        self.__password = password    # Private

    def deposit(self, amount):
        if amount > 0:
            self.__balance += amount
            print(f"{amount}원이 입금되었습니다.")

    def get_balance(self, password):
        if password == self.__password:
            return self.__balance
        else:
            return "비밀번호가 틀렸습니다."

# 객체 생성
my_acc = BankAccount("홍길동", 1000, "1234")

# 1. Public 접근
print(my_acc.owner)  # 출력: 홍길동

# 2. Private 접근 시도 (AttributeError 발생)
try:
    print(my_acc.__balance)
except AttributeError as e:
    print("접근 불가: 직접적인 __변수 접근은 차단됩니다.")

# 3. 우회 접근 (네임 맹글링 확인)
print(f"우회 접근 잔액: {my_acc._BankAccount__balance}") # 출력: 1000

5. 언제 __를 사용해야 하는가?

무분별한 던더(__) 사용은 상속 시 디버깅을 어렵게 만듭니다. 다음과 같은 상황에서 제한적으로 사용하는 것이 베스트 프랙티스입니다.

  • 클래스 확장(상속) 시 자식 클래스에서 변수 이름이 겹칠 것이 우려될 때
  • 사용자가 직접 수정하면 클래스의 내부 로직이 완전히 붕괴될 위험이 있는 핵심 데이터인 경우
  • 프레임워크나 라이브러리를 제작하여 내부 API를 엄격히 숨겨야 할 때

6. 결론: 유연함 속의 질서

파이썬의 정보 은닉은 '강제'가 아닌 '가이드'에 가깝습니다. 하지만 __ 접두사를 적절히 활용하면 코드의 의도를 명확히 전달하고, 대규모 프로젝트에서 발생할 수 있는 예기치 못한 버그를 예방할 수 있습니다. 진정한 파이썬 전문가라면 언어의 자유도를 누리되, 네임 맹글링과 같은 장치를 통해 소프트웨어의 견고함을 유지할 줄 알아야 합니다.


참고 문헌 및 출처 (Sources)

  • Python Software Foundation. "The Python Language Reference: Data Model." official documentation.
  • Real Python. "Defining Main Functions in Python." Pythonic Programming Guide.
  • Fluent Python, 2nd Edition by Luciano Ramalho (O'Reilly Media).
728x90