파이썬은 자바·C#처럼 「private」 키워드가 없습니다.
대신 「관례적 명명」으로 「외부에서 직접 접근하지 말라」는 의도를 표현합니다.
두 가지 규칙이 있습니다.
「언더스코어 한 개로 시작」 (_name) — 「내부용입니다, 외부에서 직접 쓰지 마세요」라는 약속.
강제력은 없습니다 — 사용자가 obj._name으로 접근하면 동작은 하지만 「프라이버시 침해」로 약속을 어긴 셈입니다.
PEP 8 권장 관례입니다.
「언더스코어 두 개로 시작」 (__name) — 더 강한 보호.
파이썬이 자동으로 이름을 「_ClassName__name」으로 바꿉니다(name mangling).
외부에서 obj.__name으로 접근하면 AttributeError가 납니다.
다만 obj._ClassName__name으로 우회 접근은 가능 — 「강제 격리」가 아니라 「실수 방지」입니다.
name mangling의 진짜 목적은 「다중 상속에서 이름 충돌을 막는 것」입니다.
부모 A와 부모 B가 모두 __value를 가졌다면 자동으로 _A__value와 _B__value로 분리되어 충돌이 없습니다.
단순한 「숨김」이 아니라는 점이 중요합니다.
또 「언더스코어 두 개로 시작·끝」(__init__) — 매직 메서드.
「언더스코어 한 개로 끝」(class_) — 파이썬 예약어와 충돌 회피.
이 네 가지 패턴을 알면 파이썬 코드의 명명 의도를 정확히 읽을 수 있습니다.
일반적으로 「_x는 내부용으로 쓰지 마세요」, 「__x는 정말 사용 금지」 정도로 받아들이면 됩니다.
한 줄 요약
파이썬은 private 키워드 없이 명명으로 캡슐화를 표현합니다.
_name은 「내부용 약속」, __name은 「name mangling으로 격리」, __name__은 매직 메서드입니다.
더 알아볼 것
- name mangling의 자세한 동작
- 왜 파이썬은 진짜 private를 안 만들었나
- _underscore_only — 변수 무시 관례