Programming

; develop a program

Back-End/Python

[Python] 정보 은닉(Information Hiding)

Clloud_ 2022. 9. 27. 12:11
반응형

이번 포스팅에서는 파이썬의 정보은닉(Information Hiding)에 대하여 공부를 해보고자 한다.

 


정보 은닉(Information Hiding)

정보 은닉은 객체가 가진 instance 변수나 메소드를 다른 곳에서 호출하지 못하도록 하는 것을 말한다.

 

데이터 보호가 주목적이며, instance 변수의 값을 직접 변경하지 못하게 하고 메소드를 통해 변경, 조회하도록 만든다.

C++, Java 등은 접근 제한자를 이용해 처리하는데 파이썬은 접근 제한자가 없다.
그래서 파이썬은 원칙적으로 접근 제한을 막는 방법이 없다.

 

정보 은닉 처리 방법

instance 변수 이름을 __ (double underscore)로 시작하고 __ 는 앞에만 붙인다. (뒤에 붙이면 안 됨)

ex) self.__name = name

변수 이름이 _클래스명__원래 이름 형식으로 변환되어 선언된 이름으로 호출을 할 수 없다.

ex) Person 클래스에 instance 변수명을 __name로 지정하면 내부적으로 _Person__name으로 이름이 바뀐다.
이름이 __로 시작해도 __로 끝나면 public으로 간주한다.(이름을 안 바꾼다)

 

같은 클래스 내에서는 원래 이름으로 호출할 수 있다.

 

외부에서는 바뀐 이름으로 호출해야 한다.

값을 변경하는 메소드, 조회하는 메소드를 제공한다.

변경 메소드를 setter, 조회(반환) 메소드를 getter라고 한다.

 

예제

함수를 정의하고 메소드를 private로 선언한다. (name은 2글자 이상, age는 양수 (0 이상))

class Person4:

    def __init__(self, name, age, adress=None):
        self.__name = name
        self.__age = age
        self.__adress = adress

name 값을 변경/반환해주는 메소드를 정의한다.

    def set_name(self, name):
        if len(name) >= 2:
            self.__name = name
        else:
            print("이름은 두 글자 이상 넣어주세요. 값은 변경되지 않았습니다.")

    def get_name(self):
        return self.__name
더보기

같은 클래스에서는 __이름을 호출할 수 있다.

 

age 값을 변경/반환해주는 메소드를 정의한다.

    def set_age(self, age):
        if age > 0:
            self.__age = age
        else:
            print("나이는 0보다 큰 값이여야합니다. 값은 변경되지 않았습니다.")

    def get_age(self):
        return self.__age

객체를 생성하고 속성(Attribute) 값들을 추가/수정 및 조회한다.

p = Person4('유지민', 22, '수원')
p._Person4__age

# 변경
p._Person4__age = 25
p._Person4__age

# 새로운 변수 추가
p.__name = '손흥민'
p.set_name('손흥민')

p.__age = 30
p.set_age(30)

p.__dict__

print(p.get_age())
print(p.get_name())

[실행결과]

22
25

{'_Person4__name': '손흥민',
 '_Person4__age': 30,
 '_Person4__adress': '수원',
 '__name': '손흥민',
 '__age': 30}

30
손흥민

 


property 함수

property 함수는 getter/setter 메소드를 변수 호출하는 방식으로 호출할 수 있도록 해주는 함수를 말한다.

 

porperty 함수 구문

변수명 = property(getter, setter)


변수명 = 변경할 값 (대입)인 경우, setter 호출한다.
변수명 호출(조회)인 경우, getter 호출한다.

 

예제

위의 Person4 클래스에 property 함수를 정의한다.

    name = property(get_name, set_name)
    age = property(get_age, set_age)

객체를 생성하고 속성(Attribute) 값들을 추가/수정 및 조회한다.

p = Person5('손흥민', 30, '부산')
p.name = "손"
print(p.name)

p.age = -20
print(p.age)

[실행결과]

이름은 두 글자 이상 넣어주세요. 값은 변경되지 않았습니다.
손흥민
나이는 0보다 큰 값이여야합니다. 값은 변경되지 않았습니다.
30

 


반응형