ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [파이썬/Python] 파이썬의 접근 제어자 (private)
    Python 2021. 6. 3. 18:57

    파이썬으로 자료구조를 구현하면서 궁금한 점이 생겼다.

    파이썬에도 자바처럼 접근제어자가 있을까?

     

    결론부터 말하자면 클래스를 선언할 때 변수 또는 함수명 앞에 '_' (언더스코어)를 두개 붙여서 네이밍을 해주기만 하면 된다.

     

    예를 들어 이런 클래스가 있다고 해보자

    class Person():
    
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def changeName(self, name):
            self.name = name
    
        def printInfo(self):
            print(self.name, self.age)

     

    보면 바로 이해가 되겠지만 인스턴스를 생성할 때 이름과 나이를 입력받고 이름을 변경하고 싶으면 

    changeName 함수를 통해 변경하라고 의도가 된 듯한 클래스이다.

     

    그러면 한 번 인스턴스를 생성해보자..

    p = Person("hong", 100)
    p.printInfo() #hong 100

    이런식으로 초기화 때 'hong'과 100을 인자로 넘겨주고 printInfo 함수를 실행해보면 

    결과로 hong 100을 얻을 것이다.

     

    만약 이름을 변경하고 싶으면 

    p.changeName("kim")
    p.printInfo() #kim 100

    이런식으로 changeName 함수를 통해 변경이 되고 

    결과로 kim 100을 얻는다.

    여기까지는 아무 문제가 없다.

     

    하지만 만약 설계자의 의도와 다르게 인스턴스의 변수를 직접 접근해서 변경한다면?

    p.name = "wrongName"
    p.printInfo() #wrongName 100

    당연히 변경이 된다..

    하지만 클래스를 설계할 때 이런 결과를 원하지는 않았을 것이다.

     

    그렇기 때문에 인스턴스의 변수에 직접 접근을 못하게 접근 제어자를 써야 된다

     

    그 방법은 간단하다.

    바로 '__' 언더스코어 두개..

     

    외부에서 인스턴스의 변수에 직접 접근하지 못하게 기존 클래스를 살짝 변경해보자..

    class Person():
    
        def __init__(self, name, age):
            self.__name = name
            self.__age = age
    
        def changeName(self, name):
            self.__name = name
    
        def printInfo(self):
            print(self.__name, self.__age)

    달라진 점은 변수명에 언더스코어 두개 '__'를 추가한 것이 전부다.

     

    하지만 이것으로 외부의 접근을 아주 쉽게 막을 수 있다.

    p = Person("hong", 100)
    p.__name = "wrongName"
    p.__age = 1
    p.printInfo() #hong 100

    딱히 이 코드를 실행한다고 오류가 나지는 않지만 위의 코드를 보다시피 인스턴스를 통한 변수의 할당을 시도 했지만

    초가화 때 인자로 넘겨준 값인 hong 과 100이 그대로 출력된다.

     

    함수도 마찬가지로 위와 같은 방법을 통해 private 효과를 구현할 수 있다.

     

    댓글