[Python] 접근제어

Rally·2024년 2월 22일

Python에서는 속성 및 메서드와 같은 클래스 멤버에 대한 액세스 제어가 Java 또는 C#과 같은 언어와 다르게 처리됩니다. Python의 철학은 "여기서 우리는 모두 동의하는 성인입니다"라는 지침을 따르며, 이는 클래스 사용자가 내부 규칙을 준수해야 하며 꼭 필요한 경우가 아니면 개인 데이터에 액세스하거나 수정하지 않아야 함을 의미합니다. 그러나 Python은 다른 언어보다 덜 엄격한 방식이기는 하지만 액세스 제어를 표시하고 시행하는 몇 가지 메커니즘을 제공합니다.

  1. 공개 회원:

    • 기본적으로 Python 클래스의 모든 멤버는 공개됩니다.
    • Public 멤버는 클래스 내부 또는 클래스 외부 어디에서나 액세스할 수 있습니다.
class MyClass:
    def __init__(self):
        self.public_attribute = "This is a public attribute"

obj = MyClass()
print(obj.public_attribute)  # Accessible
  1. 보호되는 회원:
    • 보호된 멤버는 보호되기 위한 것입니다. 즉, 클래스 및 해당 하위 클래스 외부에서 액세스하면 안 됩니다.
    • 관례에 따라 보호된 멤버 앞에는 단일 밑줄 '_'이 붙습니다.
    • 이것은 단지 관례일 뿐입니다. Python은 보호된 멤버에 대한 액세스 제한을 적용하지 않습니다.
class MyClass:
    def __init__(self):
        self._protected_attribute = "This is a protected attribute"

class SubClass(MyClass):
    def __init__(self):
        super().__init__()
        print(self._protected_attribute)  # Accessible within a subclass

obj = MyClass()
print(obj._protected_attribute)  # Still accessible, but not recommended
  1. 비공개 회원:
    • Private 멤버는 클래스 외부에서 접근할 수 없고 보이지 않도록 설계되었습니다.
    • 이중 밑줄 __ 접두사로 표시됩니다.
    • Python은 이러한 속성에 대해 이름 맹글링을 수행합니다. 이는 Python이 클래스 외부에서 액세스하고 수정하기 어렵게 만드는 방식으로 변수 이름을 내부적으로 변경한다는 것을 의미합니다.
class MyClass:
    def __init__(self):
        self.__private_attribute = "This is a private attribute"

    def get_private_attribute(self):
        return self.__private_attribute

obj = MyClass()
print(obj.get_private_attribute())  # Accessible via a public method
# print(obj.__private_attribute)  # Will raise an AttributeError
  1. Getter 및 Setter 메서드:
    • 비공개 또는 보호 멤버에 대한 제어된 액세스를 제공하기 위해 Python 클래스는 종종 getter 및 setter 메서드를 사용합니다.
    • Python의 property 데코레이터를 사용하면 getter, setter 및 deleter를 우아한 방식으로 정의할 수 있습니다.
lass MyClass:
    def __init__(self):
        self.__private_attribute = "This is a private attribute"

    @property
    def private_attribute(self):
        return self.__private_attribute

    @private_attribute.setter
    def private_attribute(self, value):
        self.__private_attribute = value

obj = MyClass()
print(obj.private_attribute)  # Accessible via getter
obj.private_attribute = "New Value"  # Accessible via setter

Python은 액세스 제어에 대한 규칙(속성 이름 앞에 밑줄을 붙이는 것과 같은)을 제공하지만 엄격한 적용보다는 책임 있는 사용에 더 의존합니다. 이 접근 방식은 유연성을 제공하지만 이러한 액세스 제어 규칙을 준수하려면 개발자의 규율이 필요합니다.

profile
새로운 것을 배우고 즐기며, 그 안에서 성장하길 원합니다.

0개의 댓글