Python에서 언더스코어(_)는 중요한 문법적 요소 중 하나이며, 다른 언어들에 비해 조금 특별합니다.

값을 무시하고 싶을 때

Unpacking에서 값을 무시하기 위해 사용 가능합니다.

특별한 의미의 네이밍을 위해 사용하는 경우

Java는 캡슐화(변수나 메소드에 대한 접근을 막는 것)를 지원하기 위해 private과 같은 접근 제한자를 사용합니다. 그러나 Python은 문법적으로 캡슐화를 지원하지 않으며, 암시적으로 private를 나타내기 위해 언더스코어로 시작하는 네이밍(private expression)을 사용합니다. 이는 Java와 같은 방어적 프로그래밍 언어에서 사용하는 진정한 의미의 private은 아니지만, Python의 Trust a developer라는 원칙에 의해 생긴 '책임 있는 개발자'를 지향하기 위한 문화입니다.

하나의 언더스코어로 시작하는 single leading underscored naming은 암시적으로 private을 표현하기 위해 사용합니다. 따라서 이와 같은 네이밍 룰에 의해 정의된 요소는 '외부에서 접근하지 말라'라는 권고의 의미를 지닙니다. 그러나 개발자를 믿는 문화를 기반으로 하고 있기 때문에, 이렇게 private 처리된 요소에 접근하더라도 warning 정도만 발생합니다.

두 개의 언더스코어로 시작하는 double leading underscored naming은 컨벤션이라기 보단 문법적인 요소입니다. 이는 해당 요소를 맹글링(컴파일러나 인터프리터가 요소의 이름을 그대로 사용하지 않고 변형시키는 것)하여 충돌을 방지하는 용도로 쓰입니다. 이와 같은 네이밍을 private를 구현하기 위해 사용하는 코드도 있지만, 이는 맹글링에 의해 private처럼 보여질 뿐이므로 이상적인 구현은 아닙니다.

매직 메소드

클래스에 대해 설명할 때, 생성자와 소멸자 메소드의 이름이 각각 __init____del__이었습니다. 이것도 특별한 방식의 네이밍에 속하며, 이와 같은 double leading, double trailing underscored naming 방식의 메소드를 magic method라고 부릅니다. 이러한 매직 메소드들은 Python 인터프리터에 의해 호출되는 메타 메소드(__init__ : 생성자, __del__ : 소멸자 등), 빌트인 함수에 의해 호출되는 메소드(__int__, __str__, __float__ 등)연산자 오버로딩 메소드 등을 정의할 때 사용합니다. 예를 들어, 빌트인 함수 len()의 경우 내부적으로 전달된 객체의 매직 메소드인 __len__을 호출하며, reversed()의 경우 매직 메소드 __reversed__를 호출합니다.


'Python 계열 > Python 레거시 글' 카테고리의 다른 글

[Python] 에러 처리  (0) 2018.07.04
[Python] 연산자 오버로딩  (0) 2018.07.02
[Python] 클래스의 상속  (0) 2018.06.30
[Python] 객체지향  (0) 2018.06.29
[Python] 빌트인 함수  (0) 2018.06.28

+ Recent posts