파이썬/클래스와 객체 지향

[객체 지향 프로그래밍 4개의 기둥] 캡슐화 그리고 프라이빗 메서드와 은닉화

Data Jun 2025. 3. 18. 11:02

"Python에서 _(언더스코어)를 붙이면 프라이빗(Private)인가요?"
"외부에서 접근할 수 없나요?"
"진짜 숨기는 방법은 없을까요?"

 

Python을 사용하다 보면 클래스 내부에서만 사용하고 싶은 메서드나 변수가 생기기 마련입니다.
이럴 때 "프라이빗(private)" 개념을 떠올리지만, 사실 Python에서는 완전한 은닉화(private)는 존재하지 않습니다.

이번 글에서는 Python에서 프라이빗 메서드를 정의하는 방법과 진짜 숨기는 방법, 그리고 언더스코어(_, __)의 의미를 정리해 보겠습니다.

 

Python에서 _(언더스코어)의 의미

Python에서는 "완전한 private(비공개)" 메서드가 존재하지 않습니다.
하지만, **관례(Convention)**적으로 _(언더스코어)를 사용하여 "이건 내부에서만 사용하자!"라고 표시합니다.

즉, _을 붙인다고 해서 강제로 접근이 차단되는 건 아니지만, 개발자들에게 "외부에서 사용하지 말라"는 경고 역할을 합니다.

class MailProcessor:
    def _extract_email_info(self):
        """프라이빗 메서드 (내부에서만 사용)"""
        print("Extracting email info...")

processor = MailProcessor()
processor._extract_email_info()  # ✅ 실행 가능 (하지만 권장되지 않음)

🔹 실행은 되지만, 이 메서드는 내부적으로만 사용해야 한다는 신호입니다.
🔹 다른 개발자가 사용할 때 "이건 직접 호출하면 안 되는 메서드구나!" 하고 알 수 있습니다.

 

완전히 숨기려면 __(더블 언더스코어)를 사용하자

Python에서는 이름 맹글링(Name Mangling) 기능을 활용하면 메서드를 완전히 숨길 수도 있습니다.
메서드명 앞에 __(더블 언더스코어)를 붙이면 외부에서 직접 접근할 수 없게 됩니다.

class MailProcessor:
    def __extract_email_info(self):
        """완전한 프라이빗 메서드"""
        print("Extracting email info...")

processor = MailProcessor()
processor.__extract_email_info()  # ❌ AttributeError 발생 (외부에서 접근 불가)

__extract_email_info() 메서드는 외부에서 직접 접근할 수 없기 때문에 AttributeError가 발생합니다.
하지만, 진짜 숨겨진 건 아닙니다!

이름 맹글링 기능을 사용하면 강제로 접근할 수 있습니다.

processor._MailProcessor__extract_email_info()  # ✅ 강제로 접근 가능

즉, Python에서는 완전히 숨길 수 있는 메서드는 없으며, 개발자가 원하면 강제로 접근할 수 있습니다.
하지만 이렇게 접근하는 것은 비권장 방식이며, 일반적으로는 _(언더스코어)만 사용하는 것이 Python 스타일에 맞습니다.

 

_ vs __ 차이점 정리

 

결론

 _을 붙이면?

  • 외부에서 접근할 수 있지만, "사용하지 말라"는 신호
  • 강제적인 차단이 아니라 개발자 간 약속

 __을 붙이면?

  • 외부에서 직접 접근할 수 없도록 차단
  • 하지만 이름 맹글링을 사용하면 접근 가능

즉, Python에서는 진정한 "private" 개념이 없으며, _를 붙이는 것이 일반적인 관례입니다.
완전히 숨겨야 한다면 __을 사용할 수 있지만, 대부분의 경우 _로 충분합니다.

결국, 중요한 것은 "강제적인 차단"이 아니라 "개발자 간의 신뢰"입니다! 😉