Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python 변수 앞의 단일 밑줄(_) 접두사, 어떤 의미일까?

단일 밑줄(Single Underscore)이란?

클래스 내부에서 이름 앞에 단일 밑줄(_)을 붙이는 것은, 해당 속성이나 메서드가 외부에 공개되지 않고 내부적으로만 사용될 것이라는 의도를 다른 개발자에게 알려주는 일종의 관례(convention)입니다.

일반적으로 완전한 비공개가 아닌 반비공개(semi-private) 성격의 변수에는 단일 밑줄을, 완전 비공개(fully private) 변수에는 이중 밑줄(__)을 사용하는 것이 권장됩니다.

파이썬 공식 스타일 가이드인 PEP-8에서는 이렇게 설명하고 있습니다.

_single_leading_underscore: "내부 사용(internal use)"을 나타내는 약한 표시입니다. 예를 들어, from M import * 구문은 밑줄로 시작하는 이름의 객체를 가져오지 않습니다.

예제 코드

다음 예제는 단일 밑줄과 이중 밑줄 접두사의 동작 차이를 보여줍니다.

class MyClass:
    def __init__(self):
        self.__fully_private = "World"
        self._semi_private = "Hello"

mc = MyClass()
print(mc._semi_private)     # 정상 출력됨
print(mc.__fully_private)   # AttributeError 발생

실행 결과

Hello
Traceback (most recent call last):
  File "example.py", line 7, in <module>
    print(mc.__fully_private)
AttributeError: 'MyClass' object has no attribute '__fully_private'

왜 이런 차이가 발생할까?

단일 밑줄이 붙은 _semi_private는 어디까지나 관례상의 표시일 뿐이므로, 클래스 외부에서도 자유롭게 접근할 수 있습니다. 즉, 파이썬 인터프리터가 이를 강제로 막지는 않습니다.

반면 이중 밑줄이 붙은 __fully_private는 파이썬이 네임 맹글링(name mangling)을 수행합니다. 속성 이름이 _MyClass__fully_private처럼 자동으로 변경되기 때문에, 클래스 외부에서 원래 이름으로 직접 접근하면 AttributeError가 발생합니다. 이것이 위 실행 결과에서 에러가 나는 이유입니다.

정리하자면, 단일 밑줄은 "외부에서 사용하지 말아 주세요"라는 개발자 간의 암묵적인 약속이고, 이중 밑줄은 네임 맹글링을 통해 실질적인 접근 제한까지 제공하는 방식이라고 이해하면 됩니다.