"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" 개념이 없으며, _를 붙이는 것이 일반적인 관례입니다.
완전히 숨겨야 한다면 __을 사용할 수 있지만, 대부분의 경우 _로 충분합니다.
결국, 중요한 것은 "강제적인 차단"이 아니라 "개발자 간의 신뢰"입니다! 😉
'파이썬 > 클래스와 객체 지향' 카테고리의 다른 글
인스턴스 메소드 vs 클래스 메소드 (0) | 2025.03.20 |
---|---|
[객체 지향 프로그래밍 4개의 기둥] 추상화를 통해 다형성을 구현하는 방법 (0) | 2025.03.18 |
[객체 지향 프로그래밍 4개의 기둥] 다형성 (0) | 2025.03.18 |
불필요한 인스턴스 변수 사용 줄이기: 데이터프레임을 지역 변수로 처리하는 이유 (0) | 2025.03.18 |
[객체 지향 프로그래밍 4개의 기둥] 캡슐화 (0) | 2025.03.11 |