이 포스팅에서는 아래에 소개할 네가지 사례중 네이밍시 _를 어떻게 사용하는지에 대해 다룹니다.
파이썬에서는 _ 문자가 다양한 용도로 활용됩니다. 대표적인 _를 사용하는 사례들은 다음과 같습니다.
인터프리터에서 마지막 값: 파이썬 인터프리터에서 _는 마지막으로 평가된 표현식의 값을 저장하는데 사용됩니다.
로직에서 무시되는 값: 여러 값을 반환하는 함수에서 사용하지 않을 값에 _를 할당하여 이를 무시할 수 있습니다. 예를 들어, 반복문에서 인덱스가 필요하지 않을 때도 _를 사용할 수 있습니다.
names = ['a', 'b', 'c', 'd']
names_cnt = 0
for _ in names:
names_cnt += 1
숫자 자리수 구분: 1,000,000과 같은 큰 숫자를 가독성 좋게 표기하기 위해 _를 자리수 구분자로 사용합니다. 예: 1_000_000
네이밍: 관습적으로 _를 사용하여 다양한 네이밍 규칙을 표현할 수 있습니다.
_ 앞에 붙는 경우변수나 함수 앞에 _가 하나 붙은 경우입니다.

의도: 해당 변수를 "비공개"로 취급할 것을 암시합니다. 파이썬에서는 자바와 같은 언어처럼 엄격한 private/public 접근 제한자가 없기 때문에, _를 붙여 개발자들 사이에서 해당 변수를 직접 접근하지 말라는 표현으로 사용합니다.
효과: 모듈을 from module import *로 가져올 때 _로 시작하는 변수나 함수는 자동으로 제외됩니다. 따라서 "private"한 느낌을 주지만, 이는 진짜로 private 접근제한자로 설정한 것은 아닙니다.
__ 앞에 붙는 경우변수나 함수 앞에 __ (언더스코어 2개)가 붙는 경우입니다.
의도: 변수나 함수를 클래스 내부에서 "강력하게" 비공개로 처리하고자 할 때 사용됩니다. 파이썬에서 이중 밑줄을 붙이면 네임 맹글링(name mangling)이 발생합니다.
효과: 변수의 이름이 클래스 이름에 따라 변경되어 외부에서 직접 접근하기 어려워집니다.
주의: 맹글링도 완벽하게 접근 제한자 private을 지원하지는 않습니다. 네임 맹글링 규칙에 따라 직접 접근이 가능합니다.
class MyClass:
def __init__(self):
self.__private_var = 42 # 네임 맹글링 적용
def public_method(self):
return self.__private_var, self.__manglinged_method()
def _private_method(self):
return self.__private_var, self.__manglinged_method()
def __manglinged_method(self): # 네임 맹글링 적용
print("This is a manglinged method")
myclass = MyClass()
# print(myclass.__private_var) # 맹글링 된 변수 직접적인 접근은 에러 발생
print(myclass._MyClass__private_var) # 맹글링 변수 이름을 통한 접근
print(myclass.public_method()) # 내부 메서드를 통한 접근 허용
print(myclass._private_method()) # 내부 private 메서드를 통한 접근 허용
# print(myclass.__manglinged_method()) # 맹글링 된 메서드 직접적인 접근은 에러 발생
print(myclass._MyClass__manglinged_method()) # 맹글링된 메서드 이름을 통한 접근
외부에서 __private_var나 __manglinged_method에 접근하려고 하면 AttributeError가 발생합니다. 다만, 네임 맹글링 규칙에 따라 myclass._MyClass__private_var나 myclass._MyClass__manglinged_method로 접근할 수 있습니다.
_ 뒤에 붙는 경우변수나 함수 뒤에 _가 하나 붙은 경우입니다.
의도: 미리 예약된 키워드(예: class, def)와의 충돌을 피하기 위해 사용됩니다.
class_ = MyClass() # class는 예약어이므로 class_로 네이밍하여 충돌을 피함.
효과: 충돌을 피하면서도 가독성을 유지할 수 있습니다.
__ 앞 뒤에 붙는 경우변수나 함수 뒤에 __가 붙는 경우보단 일반적으로 변수나 함수 앞뒤로 __를 붙여 사용합니다.
의도: 주로 파이썬의 데이터 모델에서 인터프리터가 자동으로 호출하는 매직 메서드라 불리는 함수나 변수에 사용합니다. 이러한 메서드는 파이썬 내부에서 특별한 동작을 수행하며, 사용자 정의 클래스에서도 재정의할 수 있습니다.
class MyClass:
def __init__(self):
pass
def __str__(self):
return "MyClass instance str"
def __repr__(self):
return "MyClass instance repr"