brunch

You can make anything
by writing

C.S.Lewis

by 내가 사는 세상 Jan 18. 2024

개체지향 - 캡슐화, 정보은닉

python 예제

목차

1. 정보은닉의 필요성

2. 느슨한 정보은닉 #언더바(_) 1개

3. 강력한 정보은닉 #언더바(__) 2개




1. 정보은닉의 필요성


 클래스의 멤버변수에 직접 접근하는 것이 가능하다면, 프로그램이 쉽게 망가질 수 있다. 이를 방지하기 위하여 캡슐화라는 개념이 필요하다. 해당 개념은 정보은닉이라는 방식으로 구현한다. 이는 은행의 예금자가 자기 마음대로 은행의 장부를 고치는 것을 방지하기 위해, 은행 창구 직원을 둔 것과 비슷하다.




2. 느슨한 정보은닉 #언더바(_) 1개


 이를 구체적으로 코드에선 멤버변수 맨앞에 언더바(_)를 붙여서 구현한다. 이는 개발자들끼리 '_가 머리에 붙어있는 멤버변수는 직접 접근하지 말자'고 약속을 한 것이다. 그래서 해당 멤버변수(_가 붙어있는 변수)를 변경하고 싶을 때는 멤버함수를 통해 이루어진다. getter와 setter가 그 역할을 한다. 하지만 장난끼 많은 개발자가 슬그머니 직접 접근을 하면 이를 막을 방법은 없다.



class MyClass:

    def __init__(self):

        self._hidden_variable = 0  # 언더스코어로 변수를 정보은닉


    def get_hidden_variable(self):

        return self._hidden_variable


    def set_hidden_variable(self, value):

        self._hidden_variable = value



# 개체 생성

obj = MyClass()


# 정보은닉된 멤버변수 출력 : 에러 발생 X

print(obj._hidden_variable)


# 멤버함수를 통해 접근

print(obj.get_hidden_variable())


# 멤버함수를 통해 값을 변경

obj.set_hidden_variable(1)




내부 로직을 좀더 살펴보자.

__dict__라는 스페셜 멤버함수는 해당 개체가 가지고 있는 멤버변수 정보를 보여준다.


print(obj.__dict__)  

# 결과 : {'_hidden_variable': 1}


위와 같은 상황이니, 

obj._hidden_variable = 2  # obj.__dict__['_hidden_variable'] = 2 와 동치

로 접근이 가능한 것이다.




3. 강력한 정보은닉 #언더바(__) 2개


 정보은닉을 약속한 멤버변수를 슬그머니 바꾸러온 개발자를 혼내보자. 우리는 멤버변수에 언더바 2개를 붙여 정보은닉을 강화할 수 있다. 상황이 이 지경에 이르면 멤버변수에 직접 접근할 땐, 시뻘건 에러가 발생한다.


class MyClass:

    def __init__(self):

        self.__hidden_variable = 0  # 언더스코어 두 개로 맹글링을 적용한 정보은닉


    def get_hidden_variable(self):

        return self.__hidden_variable


    def set_hidden_variable(self, value):

        self.__hidden_variable = value



# 개체 생성

obj = MyClass()


외부에서 직접 접근 시도 #아래 줄 주석 해제하면 AttributeError가 발생 O

# print(obj.__hidden_variable)


# 멤버함수를 통해 접근

print(obj.get_hidden_variable())


# 멤버함수를 통해 값을 변경

obj.set_hidden_variable(1)




내부 로직을 좀더 살펴보자. 개발자가 강력한 정보은닉을 위해 __멤버변수를 설정하면, 실제로 _클래스명__멤버변수로 저장된다. 이를 확인해보자.


print(obj.__dict__)

# 결과 : {'_MyClass__hidden_variable': 1}


위와 같은 상황이니, 

obj.__hidden_variable = 2  # obj.__dict__['__hidden_variable'] = 2 와 동치

로 접근이 불가능해서, AttributeError가 발생했던 것이다.


제 아무리 강력한 정보은닉을 했더라도, 아래와 같이 접근은 가능하다.

obj._MyClass__hidden_variable = 3

print(obj.get_hidden_variable()) #결과 : 3





참고자료


열혈 파이썬 중급편(윤성우)

매거진의 이전글 기초개념 - *args, **kwargs
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari