728x90


1. 정보은닉

* '객체.변수' 형식으로 변수에 직접 접근을 막음으로써 객체의 안정성을 높힐 수 있다.
* 직접 접근을 막으면 변수에 메소드를 통한 간접 접근을 하게된다.
* 변수 앞에 __(언더바 2개)를 붙히면, 변수의 직접 접근하면 오류가 발생한다. 언더바 2개를 사용한다면 스페셜 메소드와 비슷한 형태를 갖기에  _(언더바 1개)를 사용해 외부에서 직접접근을 하지말자는 관례적 표현으로 사용함(실제로 언더바 1개를 사용하면 직접접근이 가능함)
* 변수에 __(언더바 2개)를 사용하면, 변수의 이름이 '_Class명__변수명' 으로 바뀌기 때문에 직접접근이 안되는 것

 

class Person:
    def __init__(self, name, age):
        self.__name = name  # 변수 앞에 __를 넣음으로써 직접접근을 막음
        self.__age = age

    def plus_age(self, age):  # 변수 age 에 접근해 수정하기 위해서 설계한 메소드
        if age < 0:
            print("나이 정보 오류")
        else:
            self.__age += age

    def __str__(self):
        return '{0}: {1}'.format(self.__name, self.__age)


def main():
    p = Person('June', 22)
    # p.__age += 1  # 오류 발생
    # p.age += 1  # 오류 발생
    print(p)
    p.plus_age(20)  # 메소드를 통해 간접 접근한다면 변수를 수정할 수 있음
    print(p)


main()

 


2. __dict__

* 어떤 속성과 값이 객체 내에 있는지 알 수 있는 메소드
* 객체 내에는 __dict__ 이 있으며 이는 딕셔너리다. 또, __dict__에는 해당 객체의 정보가 담긴다.

 

class Person:
    def __init__(self, name, age):
        self.__name = name  # 변수 앞에 __를 넣음으로써 직접접근을 막음
        self.__age = age

    def plus_age(self, age):  # 변수 age 에 접근해 수정하기 위해서 설계한 메소드
        if age < 0:
            print("나이 정보 오류")
        else:
            self.__age += age

    def __str__(self):
        return '{0}: {1}'.format(self.__name, self.__age)


def main():
    p = Person('June', 22)
    print(p)  # June: 22
    print(p.__dict__)  # {'_Person__name': 'June', '_Person__age': 22}


main()

 


 

728x90

+ Recent posts