이중 밑줄(더블 언더스코어) 접두사란?
파이썬에서는 속성(attribute) 이름 앞에 이중 밑줄(__)을 붙이면 해당 속성을 클래스 외부에서 직접 접근하거나 조회할 수 없게 됩니다. 이중 밑줄은 속성 이름에 네임 맹글링(name mangling, 이름 변형)을 적용합니다. 물론 특수한 문법을 사용하면 여전히 해당 변수에 접근할 수 있지만, 일반적으로 그렇게 하는 것은 바람직하지 않습니다. 즉, 이중 밑줄은 완전한 비공개(private) 변수를 선언할 때 사용됩니다.
파이썬 공식 문서의 설명
파이썬 공식 문서에 따르면 다음과 같습니다.
"클래스가 상속될 목적으로 설계되었고, 하위 클래스에서 사용하지 않기를 원하는 속성이 있다면, 뒤에 밑줄 없이 이중 선행 밑줄만 붙여 이름을 지정하는 것이 좋습니다. 이렇게 하면 파이썬의 네임 맹글링 알고리즘이 작동하여 클래스 이름이 속성 이름에 결합됩니다. 덕분에 하위 클래스가 실수로 같은 이름의 속성을 정의하더라도 속성 이름 충돌을 방지할 수 있습니다."
예제 코드
아래 코드는 이중 밑줄의 사용 예를 보여줍니다.
class MyClass:
__hiddenVar = 0
def add(self, increment):
self.__hiddenVar += increment
print(self.__hiddenVar)
myObject = MyClass()
myObject.add(3)
myObject.add(8)
print(myObject.__hiddenVar)
실행 결과
3
11
Traceback (most recent call last):
File "C:/Users/TutorialsPoint1/.PyCharmCE2017.2/config/scratches/scratch_1.py", line 12, in <module>
print(myObject.__hiddenVar)
AttributeError: MyClass instance has no attribute '__hiddenVar'
위 프로그램에서 add() 메서드를 통한 내부 호출은 정상적으로 값 3과 11을 출력하지만, 마지막 줄에서 객체를 통해 클래스 외부에서 숨겨진 변수 __hiddenVar에 직접 접근하려고 하자 AttributeError 예외가 발생했습니다.
참고: 맹글링된 이름 규칙
네임 맹글링이 적용되면 실제 내부 속성 이름은 _클래스명__속성명 형태로 변경됩니다. 따라서 myObject._MyClass__hiddenVar와 같이 작성하면 기술적으로 접근하는 것이 가능합니다. 하지만 이는 캡슐화 의도를 무시하는 행위이므로 실무에서는 사용하지 않는 것이 좋습니다.