본문 바로가기

Python/Python Basic

Class] 2. 정보은닉(private, protected, public)

- c++, java 등의 기타 OOP 언어와는 달리, 파이썬의 경우 restricted한 제한자 적용을 할 수 없음

- 파이썬에서의 모든 속성, 메소드는 기본적으로 public

- 즉, 클래스의 외부에서 속성, 메소드에 접근이 가능 (사용가능)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Bottle:
    
    def __init__(self, quantity):
        self.quantity = quantity
        
    def fill(self, quantity):
        self.quantity = quantity
        
    def empty(self):
        self.quantity = 0
        
    def show(self):
        print '{}ml inside the bottle'.format(self.quantity)
        
bottle = Bottle(20)
bottle.show()
 
bottle.fill(100)
bottle.show()
 
bottle.empty()
bottle.show()
 
bottle.quantity = 20
bottle.show()
 
 
<<<<< 실행결과 >>>>>
 
20ml inside the bottle
100ml inside the bottle
0ml inside the bottle
20ml inside the bottle
cs


Protected

- 해당 클래스와 그것의 하위 클래스에서만 접근 가능

- 파이썬에서는 해당 속성의 앞에 _(single underscore)를 붙여서 해결

- 실제 runtime에서의 제약사항은 아니고, 실제 클래스를 사용하는 사용자에게 경고 형태로만 제공

- 파이썬에서 protect는 기능은 하지만 그저 경고하는 것에 지나지 않음..마음대로 써라.. 하지만 책임은 지지 않겠다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class Bottle:
    
    def __init__(self, quantity):
        self._quantity = quantity
        
    def fill(self, quantity):
        if self._quantity + quantity > 100:
            self._quantity = 100
        else:
            self._quantity += quantity
            
    def empty(self):
        self._quantity = 0
        
    def show(self):
        print '{}ml inside the bottle'.format(self._quantity)
    
bottle = Bottle(20)
bottle.show()
 
bottle.fill(40)
bottle.show()
 
bottle.fill(50)
bottle.show()
 
## 100ml 이상 담을 수 없게 구현했으나, 사용자가 마음대로 외부에서 설정
bottle._quantity = 2000
bottle.show()
 
bottle.fill(2000)
bottle.show()
 
 
<<<<< 실행결과 >>>>>
 
20ml inside the bottle
60ml inside the bottle
100ml inside the bottle
2000ml inside the bottle
100ml inside the bottle
cs



private

- 해당클래스의 외부에서는 접근 불가능

- 파이썬의 경우 속성이름 앞에 __(double underscore)를 붙여서 private 속성으로 설정

- name mangling을 통해 속성의 이름을 변경하는 기법으로 private로 설정

- 해당 속성의 경우 클래스의 외부에서 접근할 경우 에러 발생

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class Bottle:
    def __init__(self, quantity):
        self.__quantity = quantity
        
    def fill(self, quantity):
        if self.__quantity + quantity > 100:
            self.__quantity = 100
        else:
            self.__quantity += quantity
        
    def empty(self):
        self.__quantity = 0
        
    def show(self):
        print '{}ml inside the bottle'.format(self.__quantity)
        
        
bottle = Bottle(20)
bottle.fill(100)
bottle.empty()
bottle.show()
 
### 아무런 변화를 주지 못한다
bottle.__quantity = 3000
bottle.show()
 
### name mangling으로 속성의 이름을 변경
bottle._Bottle__quantity = 3000
bottle.show()
 
<<<<< 실행결과 >>>>>
 
0ml inside the bottle
0ml inside the bottle
3000ml inside the bottle
cs



반응형