클래스 내의 변수나 메서드 앞에 _(single underscore) 또는 __(double underscore)를 사용하는 것은 정보 은닉과 관련된 컨벤션을 따르는 방식입니다.
아래는 각각의 차이점과 특징을 정리한 내용입니다.
_ (Single Underscore)의미와 용도:
_는 "protected"로 간주되며, 변수나 메서드가 외부에서 직접 접근하지 않기를 권장하는 컨벤션입니다.특징:
class Person:
def __init__(self, name):
self._name = name
p = Person("홍길동")
print(p._name) # 외부에서 접근 가능_로 시작하는 이름을 특별히 다루지 않습니다.주요 단점:
__ (Double Underscore)의미와 용도:
__는 "private"처럼 동작하며, 변수나 메서드가 클래스 외부에서 직접 접근하지 못하도록 네임 맹글링(name mangling)을 적용합니다.특징:
__로 시작하는 속성 이름을 클래스명으로 변경합니다.self.__name은 내부적으로 _ClassName__name으로 변경됩니다.class Person:
def __init__(self, name):
self.__name = name
p = Person("홍길동")
print(p.__name) # AttributeError 발생
print(p._Person__name) # '홍길동' 출력 (내부적으로 맹글링된 이름을 직접 사용)주요 단점:
_ vs __ 비교 요약| 특징 | _ (Single Underscore) | __ (Double Underscore) |
|---|---|---|
| 의미 | Protected-like | Private-like |
| 접근 제한 | 접근 가능 (컨벤션 상 조심) | 네임 맹글링으로 외부 접근 차단 |
| 네임 맹글링 | 없음 | 있음 (클래스명 포함하여 이름 변경) |
| 사용 목적 | 내부 구현 세부사항을 알리는 용도 | 변수나 메서드의 정보 은닉 |
| 외부 접근성 | 접근 가능 | 맹글링된 이름으로만 접근 가능 |
| 주의 사항 | 컨벤션에 의존 | 여전히 내부적으로 접근 가능 |
_는 컨벤션에 기반한 접근 제한으로, 사용자가 신중하게 다루기를 권장합니다.__는 Python의 네임 맹글링을 활용하여 보다 강력한 정보 은닉을 제공합니다.__를 사용하며, 단순히 내부 변수임을 알리고 싶은 경우 _를 사용합니다.