본문 바로가기
Python

[Python 기초] 파이썬 클래스 - 클래스 멤버(static) 와 접근제어자(public , private , getter , setter)

by dev수니 2021. 4. 5.
반응형

 

 

 1  클래스 멤버

 

클래스 멤버클래스 변수, 클래스 메서드를 뜻한다. 이는 공유 변수, 공유 메서드이기도 하다. 해당 변수와 메서드는 변경되지 않고 정적이라는 의미로 static이라고도 한다.

 

클래스 멤버는 모든 인스턴스가 공유한다. 인스턴스 생성 이전에 이미 메모리 공간에 할당된다. 따라서 객체를 생성하지 않아도 접근이 가능하다. 

 

접근방법

클래스명.메서드()
@classmethod 를 앞에 붙여준다.

 

 


 

 

# 클래스 변수(공유변수)와 인스턴스 변수 예제

1
2
3
4
5
6
7
8
9
10
11
12
class B:
     int1 = 0     # 클래스 변수
 
b1 = B()
print("b1인스턴스",b1.int1)
print("B클래스",B.int1)     # 클래스 변수
# 인스턴스를 생성하지 않아도 메모리에 올라가있어 출력된다.
 
print()
b1.int1 = 1000    # 인스턴스 내의 int1변수 값을 변경한 것이다.
print("b1인스턴스",b1.int1)
print("B클래스",B.int1)
cs
0
b1인스턴스 0
B클래스 0

b1인스턴스 1000
B클래스 0
>>>

줄4에서 인스턴스를 생성해주고 줄5에서 생성된 인스턴스의 변수 int1을 출력했다. 그리고 줄6에서 B클래스의 int1을 출력하였다. int1이 클래스 변수이기 때문에 인스턴스를 따로 생성해주지 않아도 호출이 가능하다.

 

그리고 줄10에서 인스턴스 변수 int1의 값을 1000으로 변경해주고 다음 인스턴스와 클래스변수를 각각 출력해 주었다. 

그 결과 인스턴스 변수 int1만 값이 변경된 것을 확인할 수 있다.

 

 

 

 

 


 

 

 

# 클래스변수(공유변수) 예제 

1
2
3
4
5
6
7
8
9
10
11
12
13
class Account: 
     count = 1    # static (공유 변수)
     count_number = 1111 # static (공유 변수)
 
     def __init__(self,money):
          self.money = money
          print(Account.count, "번 고객님 계좌>",Account.count_number)
          Account.count += 1
          Account.count_number += 1
          self.count = 100
 
a1 = Account(10000)
b1 = Account(1000)
cs

 

1 번 고객님 계좌> 1111
2 번 고객님 계좌> 1112
>>>

 

 

 

 


 

 

 2  접근제어자

 


접근의 범위를 설정할 수 있다. 클래스와 변수, 메서드의 공개, 비공개를 설정할 수 있다.

 


public : 클래스 안, 밖에서 모두 접근가능하다.

__변수명__ or 변수명
__메서드명__ or 메서드명

 

private : 클래스 내부에서만 접근가능하다.

__변수명
__메서드명

 

 


 

 

# 다음은 id,pw 를 저장하는 예제이다. pw를 private 으로 설정한다.

1
2
3
4
5
6
7
class Id:
     def __init__(self,id1,pw):
          self.id1 = id1
          self.__pw = pw    # pw는 보안상 외부노출X        
# main()
soon = Id("soon1234",1234)
print(soon.pw)      # 클래스 외부에서 pw에 직접접근
cs

 

줄4에서 객체.__pw 로 __를 사용해 private 으로 설정해주었다.

따라서 줄7과같이 클래스 바깥에서 pw변수에 접근하려고 할 경우 다음과 같이 에러가발생한다.

 

Traceback (most recent call last):
    File "C:/pjs/Python/Day7_practice8.py", line 10, in <module>
       print(soon.pw)
AttributeError: 'Id' object has no attribute 'pw'
>>>

 

 

 


 

 

# 따라서 다음과 같이 info()를 사용해 pw에 접근할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
class Id:
     def __init__(self,id1,pw):
          self.id1 = id1
          self.__pw = pw    # pw는 보안상 외부노출X
 
     def info(self):
          print(self.__pw)
          print(self.id1)
          
# main()
soon = Id("soon1234",1234)
# print(soon.pw)      # 클래스 외부에서 pw에 직접접근
soon.info()
cs
1234
soon1234
>>>

 

위와 처럼 같은 클래스 내에서는 private에 접근이 가능하기 때문에 메서드를 사용하여 private를 안에 담고 클래스 외부에서 해당 메서드에 접근하게끔 할 수 있다.

 

 

 


 

 

 3  접근자(getter)와 설정자(setter)

 

 

private 는 접근이 불가능하기 때문에 별도의 메서드가 필요하다. private가 같은 클래스 내에 있으면 접근이 가능하므로 이를 반환하고 변경하는 메서드를 만들어 사용한다.

 

getter : 인스턴스의 값을 반환한다.
setter : 인스턴스의 값을 변경한다.

 

 

 

 

# setter와 getter를 이용해 pw에 접근한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Id:
     def __init__(self,id1,pw):
          self.id1 = id1
          self.__pw = pw    # pw는 보안상 외부노출X
 
     def info(self):
          print(self.__pw)
          print(self.id1)
 
     def getPw(self):    # getter
          return self.__pw
 
     def setPw(self,p):  # setter
          self.__pw = p
          return self.__pw
          
# main()
soon = Id("soon1234",1234)
#print(soon.pw)      # 클래스 외부에서 pw에 직접접근
soon.info()
 
soon.setPw(4567)
print(soon.getPw())
cs
1234
soon1234
4567
>>>

getter 와 setter 를 사용하여 __pw 값을 반환하고 변경하는 메서드를 만들었다. 결과를 보면 줄20에서 info() 메서드로 __pw 에 접근하였고 값은 1234 라는 것을 알 수 있다.

 

그리고 줄22에서 setPw() 로 __pw 값을 4567 로 변경해주었고 줄23에서 getPw() 로 값을 반환하여 출력한 결과를 확인할 수 있다.

 

 

 

 

 

 

반응형

댓글