프로그래밍파이썬 개발자

파이썬에서 보호 변수 및 메서드와 비공식 변수가 무엇인지, 캡슐화가 어떻게 구현되는지, 그리고 파이썬이 객체의 내부 상태를 실제로 얼마나 보호하는지에 대해 설명해 주세요.

Hintsage AI 어시스턴트로 면접 통과

답변.

질문의 역사
전통적인 객체 지향 프로그래밍에서 캡슐화는 내부 데이터에 대한 접근을 제한함으로써 구현됩니다. 대부분의 언어에는 엄격한 접근 수정자가 있습니다. 파이썬에서는 "우리는 모두 성인입니다"라는 원칙이 적용되며, 엄격한 비공식성이 없습니다.

문제
개발자들은 파이썬에서 보호된 (_protected) 및 비공식(__private) 속성 및 메서드를 혼동하며, "이중 밑줄"이 완전한 보호를 제공한다고 생각하거나 완전히 보호가 없다고 생각합니다.

해결
파이썬은 다음과 같은 규약을 구현합니다: 단일 밑줄 _var는 보호된 속성, 이중 밑줄 __var는 비공식적인 속성(이름 맹글링). 이러한 속성이나 메서드에 접근할 수 있지만 더 어렵습니다: _ClassName__var로 호출됩니다.

코드 예:

class Example: def __init__(self): self._protected = 1 # 보호됨 self.__private = 2 # 비공식적 (이름 맹글링) ex = Example() print(ex._protected) # 1 #print(ex.__private) # AttributeError print(ex._Example__private) # 2 (이름 맹글링)

주요 특징:

  • 단일 밑줄 — 클래스 및 계층 구조 외부에서 "건드리지 마세요"라는 규약.
  • 이중 밑줄 — 이름 맹글링: 바이트 코드에 변수를 위한 클래스 이름이 추가됩니다.
  • 파이썬은 접근을 금지하지 않고, 오히려 어렵게 만들어 주는 것입니다 — 이는 엄격한 제한이 아닌 규약입니다.

함정 질문.

인스턴스를 통해 "비공식적인" 속성에 접근할 수 있습니까?

네, 맹글링을 통해 가능합니다: _ClassName__var. 그렇기 때문에 데이터에 접근할 수 있지만, 명시적이지 않습니다.

상속 시 비공식적인 메서드/속성이 어떻게 작동합니까?

이름 맹글링은 상속자가 부모의 비공식적인 요소를 우연히 재정의하는 것을 방해하지만, _ParentClass__attr을 통해 접근할 수 있습니다. 이중 밑줄이 있는 메서드는 자식 클래스 외부에서 "보이지" 않습니다.

class A: def __foo(self): print("A") class B(A): def bar(self): # self.__foo() — 오류 self._A__foo() # 작동함

파이썬에 JVM/C++ 수준의 완전한 비공식성이 있습니까?

아니요. 모든 것은 규약과 맹글링에 기반하고 있습니다. 데이터를 완전히 보호할 수는 없으며, 파이썬은 동적으로 모든 속성에 접근할 수 있도록 허용합니다.

전형적인 실수 및 안티 패턴

  • 이중 밑줄을 통해 완전한 보호를 기대하는 것.
  • 상속된 클래스에서 비공식적인 메서드를 사용하는 것, 이는 가독성과 확장성을 저해합니다.
  • 단일 밑줄이 충분한 곳에서 이중 밑줄을 과도하게 사용하는 것.

실생활 예시

부정적인 사례

대형 라이브러리에서 사용자가 비공식 속성을 이중 밑줄로 변경하려고 했는데, 이것이 "비밀"이라고 생각했지만, 여전히 _ClassName__var를 통해 변경이 발생했습니다.

장점:

  • 자동 완성으로부터 속성을 공식적으로 숨김.

단점:

  • 비공식성에 대한 잘못된 환상.
  • 클래스의 불변성을 깨뜨릴 수 있는 가능성.

긍정적인 사례

프로젝트에서 내부 필드에 대해 단일 밑줄을 사용하고 클래스 외부에서 이를 건드리지 않도록 합의했습니다. 안전한 접근을 위해 프로퍼티를 추가했습니다.

장점:

  • 가독성 및 규약 준수.
  • 코드 유지 관리 용이.

단점:

  • 엄격한 비공식성의 부재: 불행한 개발자가 합의를 위반하고 접근할 수 있습니다.