파이썬 코드를 보다 보면 __init__, __str__, __len__처럼 이름 앞뒤에 이중 밑줄(double underscore)이 붙은 함수나 메서드를 자주 만나게 됩니다. 이런 이름들은 흔히 '던더(dunder, double underscore의 줄임말)' 메서드 또는 매직 메서드(magic method)라고 불립니다.
이중 밑줄 이름의 정체
앞뒤로 이중 밑줄이 붙은 이름은 파이썬 인터프리터가 내부적으로 특별한 용도로 사용하기 위해 예약해 둔 이름입니다. 대표적인 예는 다음과 같습니다.
- __init__: 객체가 생성될 때 자동으로 호출되는 초기화 메서드
- __str__: 객체를 문자열로 표현할 때 호출되는 메서드
- __len__: len() 함수가 실행될 때 객체의 길이를 반환하는 메서드
임의로 만들지 말아야 하는 이유
핵심은 이렇습니다. 이중 밑줄로 시작하고 끝나는 이름은 사실상 파이썬 내장(built-in) 기능을 위해 예약된 영역이라는 점입니다. 따라서 우리가 클래스, 함수, 변수 이름을 지을 때 이와 유사한 형태의 이름을 사용하지 않는 것이 좋습니다.
만약 __myfunc__처럼 임의로 만든 이름을 사용하면, 향후 파이썬 버전에서 동일한 이름의 특수 메서드가 추가될 경우 충돌이 발생하거나 예기치 않은 동작을 일으킬 수 있습니다.
함께 알아두면 좋은 밑줄 관례
- _name (앞에 밑줄 하나): "내부적으로만 사용하라"는 관례적 신호입니다.
- __name (앞에만 밑줄 두 개): 네임 맹글링(name mangling)이 적용되어 클래스 외부에서 접근하기 어려워집니다.
- __name__ (앞뒤로 밑줄 두 개): 파이썬 시스템 전용 특수 이름이므로 사용자 정의를 피해야 합니다.
정리
이름 앞뒤에 이중 밑줄이 붙은 식별자는 파이썬이 자체적으로 사용하는 특수한 이름입니다. 일반적인 코드 작성 시에는 이러한 형식의 이름을 새로 만들지 않는 것이 안전하며, 필요하다면 이미 정의된 던더 메서드를 오버라이드(재정의)하는 방식으로 활용하는 것이 올바른 사용법입니다.