본문 바로가기
코딩취미/Python

[파이썬] 클래스 private와 protected 메소드 사용방법 및 특징

by 브링블링 2024. 1. 16.
728x90

클래스 private와 protected  메소드 사용방법 및 특징

파이썬에서는 private(비공개) 및 protected(보호된) 메소드를 만드는 공식적인 방법이 다른 프로그래밍 언어들과 다소 다릅니다. 파이썬은 이름 맹글링(name mangling)이라는 메커니즘을 사용하여 private 및 protected 메소드에 대한 접근을 제한합니다. 이는 파이썬의 '우리는 모두 책임감 있는 성인이다'라는 철학에 기반한 것으로, 개발자들에게 클래스의 내부 구현에 대한 접근을 완전히 막기보다는 자제력을 요구합니다.

Private 메소드

  • Private 메소드는 클래스 내부에서만 사용되도록 의도된 메소드입니다.
  • 파이썬에서는 메소드 이름 앞에 두 개의 밑줄(__)을 붙여서 private 메소드를 나타냅니다.
  • 예: __my_private_method

Protected 메소드

  • Protected 메소드는 해당 클래스 및 그 서브클래스에서만 사용되어야 합니다.
  • 메소드 이름 앞에 하나의 밑줄(_)을 붙여서 protected 메소드를 나타냅니다.
  • 예: _my_protected_method
class MyClass:
    def __init__(self):
        self.__private_method()  # private 메소드 호출
        self._protected_method()  # protected 메소드 호출

    def __private_method(self):
        print("This is a private method")

    def _protected_method(self):
        print("This is a protected method")

# 클래스 인스턴스 생성
obj = MyClass()

# 외부에서 private 및 protected 메소드에 접근 시도
# obj.__private_method()  # 오류 발생
# obj._protected_method()  # 가능하지만 권장되지 않음

이 코드에서 __private_method는 클래스 외부에서 접근할 수 없습니다. 반면에 _protected_method는 접근할 수 있지만, 일반적으로 이렇게 하지 않는 것이 좋습니다. 이러한 규칙은 파이썬의 캡슐화 원칙을 따르는 데 도움이 되며, 클래스의 내부 구현을 보호하는 데 중요한 역할을 합니다.

728x90

private 및 protected 메소드를 정의하고 사용하는 예제

간단한 클래스를 정의하고, 이 클래스 내부에 private 메소드와 protected 메소드를 정의한 후, 이 메소드들을 클래스 내부와 상속받은 서브클래스에서 어떻게 사용하는지 보여드리겠습니다.

class ParentClass:
    def __init__(self):
        self.__private_method()  # private 메소드 호출
        self._protected_method()  # protected 메소드 호출

    def __private_method(self):
        print("This is a private method of ParentClass")

    def _protected_method(self):
        print("This is a protected method of ParentClass")

class ChildClass(ParentClass):
    def __init__(self):
        super().__init__()
        # self.__private_method()  # 이 코드는 오류를 발생시킵니다. private 메소드에 접근할 수 없음
        self._protected_method()  # protected 메소드 호출 가능

    def demo_method(self):
        # self.__private_method()  # 이 코드는 오류를 발생시킵니다. private 메소드에 접근할 수 없음
        self._protected_method()  # protected 메소드 호출 가능

# 객체 생성 및 메소드 호출
parent = ParentClass()
child = ChildClass()
child.demo_method()

 

사용 방법 설명

  1. Private 메소드 (__private_method):
  • 이 메소드는 두 개의 밑줄(__)로 시작합니다. 이것은 파이썬에서 private 메소드를 나타냅니다.
  • Private 메소드는 클래스 내부에서만 직접 호출할 수 있습니다. 이 메소드는 클래스 외부나 서브클래스에서 직접 접근할 수 없습니다.
  • ParentClass 내부의 __init__ 메소드에서 __private_method가 호출됩니다. 이는 클래스 내부에서의 사용 예시입니다.
  1. Protected 메소드 (_protected_method):
    • 이 메소드는 하나의 밑줄(_)로 시작합니다. 이것은 파이썬에서 protected 메소드를 나타냅니다.
    • Protected 메소드는 클래스 내부와 상속받은 서브클래스에서 접근할 수 있습니다.
    • ParentClass의 __init__ 메소드와 ChildClass의 __init__ 및 demo_method 메소드에서 _protected_method가 호출됩니다. 이는 클래스 내부와 서브클래스에서의 사용 예시입니다.

주의 사항

  • 파이썬은 엄격한 접근 제어를 제공하지 않습니다. 따라서 private 메소드도 특정한 방법(예: 이름 맹글링을 통한 접근)을 사용하면 접근할 수 있습니다. 하지만 이는 일반적으로 권장되지 않습니다.
  • Protected 메소드는 클래스 외부에서도 접근할 수 있지만, 일반적으로 이러한 접근은 클래스의 캡슐화를 위반하는 것으로 간주되므로 권장되지 않습니다.
728x90