[python] 프라빗 클래스 데이터 패턴

데이터의 캡슐화는 객체 지향 프로그래밍에서 중요한 개념 중 하나입니다. 이를 통해 데이터에 대한 직접적인 접근을 제어하여 안정성과 유지 보수성을 향상시킬 수 있습니다. Python에서는 클래스의 멤버 변수를 보호하기 위해 네이밍 컨벤션을 통해 “private” 변수를 지정할 수 있습니다.

Python에서는 _ (밑줄)로 시작하는 변수 이름을 private 변수로 간주합니다. 하지만 이것은 단지 네이밍 컨벤션에 불과하며, 실제로 변수에 접근하는 것을 막지는 않습니다. 따라서 프라이빗 클래스 데이터를 보호하기 위해서는 몇 가지 추가적인 패턴을 사용해야 합니다.

1. 네이밍 컨벤션을 사용하는 방법

클래스 내에 private 변수를 사용하려면, 변수 이름 앞에 언더스코어 _ 를 붙이는 것으로 시작합니다. 이로 인해 개발자들은 해당 변수가 private 변수임을 알 수 있으며, 외부에서 직접 접근하지 않는 것이 좋습니다.

class MyClass:
    def __init__(self):
        self._private_var = 10    # 프라이빗 변수 선언

my_obj = MyClass()
print(my_obj._private_var)    # 프라이빗 변수 접근 (권장하지 않음)

위의 코드에서는 _private_var 변수를 private 변수로 사용하며, 해당 변수에 직접 접근하는 것을 확인할 수 있습니다. 하지만 이는 디자인 패턴을 따르지 않는 잘못된 방법입니다.

2. 게터/세터 메서드를 사용하는 방법

캡슐화를 강제하기 위해 getter와 setter 메서드를 사용하는 방법도 있습니다. 이는 프라이빗 변수에 접근하고 수정할 수 있는 역할을 담당합니다.

class MyClass:
    def __init__(self):
        self._private_var = 10    # 프라이빗 변수 선언

    def get_private_var(self):
        return self._private_var

    def set_private_var(self, value):
        self._private_var = value

my_obj = MyClass()
print(my_obj.get_private_var())    # getter를 통한 프라이빗 변수 접근
my_obj.set_private_var(20)    # setter를 통한 프라이빗 변수 수정

위의 코드에서는 get_private_var() 메서드를 통해 프라이빗 변수에 접근하고, set_private_var() 메서드를 통해 프라이빗 변수를 수정합니다.

3. 프라이빗 변수를 완전히 보호하는 방법

프라이빗 변수를 완전히 보호하기 위해, __ (더블 언더스코어)로 시작하는 네이밍 컨벤션을 사용할 수 있습니다. 이는 python의 이름 맹글링(name mangling) 기능을 활용하는 것입니다.

class MyClass:
    def __init__(self):
        self.__private_var = 10    # 완전히 보호된 프라이빗 변수 선언

    def get_private_var(self):
        return self.__private_var

    def set_private_var(self, value):
        self.__private_var = value

my_obj = MyClass()
print(my_obj.get_private_var())    # getter를 통한 프라이빗 변수 접근
my_obj.set_private_var(20)    # setter를 통한 프라이빗 변수 수정

위의 코드에서는 __private_var 변수를 완전히 보호된 private 변수로 사용하고 있습니다. 이러한 변수에는 직접 접근할 수 없으며, getter와 setter 메서드를 사용하여 변수에 접근 및 수정할 수 있습니다. 이를 통해 외부에서의 무단 접근을 막고 클래스의 데이터를 보호하는 데 도움이 됩니다.

프라이빗 클래스 데이터 패턴을 사용하여 클래스의 데이터를 캡슐화하면 변수의 접근을 제어하고 안정성을 높일 수 있습니다. 적절한 접근 제어 메커니즘이 필요한 경우에는 getter와 setter 메서드를 활용하거나 완전히 보호된 프라이빗 변수를 활용하는 것이 좋습니다.

참고 자료