[참고] 저자 본인의 공부 및 참고용으로 쓰여진 글인점을 알려드립니다.
# 코딩도장의 내용입니다.
https://dojang.io/mod/page/view.php?id=2374
파이썬 코딩 도장: 34.3 비공개 속성 사용하기
앞에서 만든 Person 클래스에는 hello, name, age, address 속성이 있었습니다. class Person: def __init__(self, name, age, address): self.hello = '안녕하세요.' self.name = name self.age
dojang.io
Person 클래스에는 hello, name, age,address 속성이 있었습니다.
class Person:
def __init__(self, name, age, address):
self.hello = '안녕하세요.'
self.name = name
self.age = age
self.address = address
이 속성들은 메서드에서 self 로 접근할 수 있고, 인스턴스.속성 형식으로 클래스 바깥에서도 접근할 수 있습니다.
클래스 바깥에서는 접근할 수 없고 클래스 안에서만 사용할 수 있는 비공개 속성(private attribute) 을 사용해보겠습니다.
비공개 속성은 __속성 과 같이 이름이 __(밑줄 두 개) 로 시작해야 합니다. 단, __속성__ 처럼 밑줄 두 개가 양 옆에 왔을 때는 비공개 속성이 아니므로 주의해야 합니다.
class 클래스이름 :
def __init__(self, 매개변수):
self.__속성 = 값
그럼 Person 클래스에 지갑 속성 __wallet 을 넣어보겠습니다.
class Person:
def __init__(self, name, age, address, wallet) :
self.name = name
self.age = age
self.address = address
self.__wallet = wallet # 변수 앞에 __를 붙여서 비공개 속성으로 만듦
maria = Person('마리아', 20, '서울시 서초구 반포동', 10000)
maria.__wallet -= 10000 # 클래스 바깥에서 비공개 속성에 접근하면 에러가 발생함
self.__wallet 처럼 앞에 밑줄 두 개를 붙여서 비공개 속성으로 만들었으므로 클래스 바깥에서 maria.__wallet 으로는 접근할 수 없습니다. 사람이 가지고 있는 지갑은 본인만 사용할 수 있는데 maria.__wallet -= 10000 처럼 바깥에서 마음대로 돈을 뺄 수는 없겠죠?
비공개 속성은 클래스 안의 메서드에서만 접근할 수 있습니다. 다음과 같이 돈을 내는 pay 메서드를 만들어봅니다.
class Person:
def __init__(self, name, age, address, wallet) :
self.name = name
self.age = age
self.address = address
self.__wallet = wallet # 변수 앞에 __를 붙여서 비공개 속성으로 만듦
def pay(self, amount) :
self.__wallet -= amount # 비공개 속성은 클래스 안의 메서드에서만 접근할 수 있음.
print('이제 {}원 남았네요.'.format(self.__wallet))
maria = Person('maria', 20, 'seoul seocho banpo', 10000)
maria.pay(3000)
pay 는 돈을 내면 해당 금액을 지갑에서 빼도록 만들었다. 이제 지갑에 있는 돈을 쓸 수 있게 되었습니다.
물론 지갑에 든 돈을 굳이 밝힐 필요가 없으므로 print 로 출력하지 않아도 된다. 보통은 다음과 같이 지갑에 든 돈이 얼마인지 확인하고 돈이 모자라면 쓰지 못하는 식으로 만든다.
def pay(self, amount) :
if amount > self.__wallet :
print("돈이 모자람")
return
self.__wallet -= amount
이처럼 비공개 속성은 클래스 바깥으로 드러내고 싶지 않은 값에 사용한다. 즉, 중요한 값인데 바깥에서 함부로 바꾸면 안될 때 비공개 속성을 주로 사용합니다. 비공개 속성을 바꾸는 경우는 클래스의 메서드로 한정한다.
클래스는 특정 개념을 표현 (정의) 만 할 뿐 사용을 하려면 인스턴스로 만들어야 한다는 점이 중요하다!!
그리고 속성, 메소드를 사용할 때는 self와 인스턴스를 통해 사용해야 한다는 점도 잊지않아야 한다.
참고 | 공개 속성과 비공개 속성
클래스 밖에서 접근할 수 있는 속성을 공개 속성 (public attribute) 이라 부르고, 클래스 안에서만 접근할 수 있는 속성을 비공개 속성(private attribute) 이라고 부른다.
참고 | 비공개 메서드 사용하기
속성뿐만 아니라 메서드도 이름이 __(밑줄 두 개) 로 시작하면 클래스 안에서만 호출할 수 있는 비공개 메서드가 된다.
class Person :
def __greeting(self) :
print("hello")
def hello(self) :
self.__greeting() # 클래스 안에서는 비공개 메서드를 호출할 수 있음.
james = Person()
james.__greeting() # error : 클래스 바깥에서는 비공개 메서드를 호출할 수 없음.
비공개 메서드도 메서드를 바깥으로 드러내고 싶지 않을 때 사용한다. 보통 내부에서만 호출되어야 하는 메서드를 비공개 메서드로 만든다. 예를 들어 게임 캐릭터가 마나를 소비해서 스킬을 쓴다고 치면 마나 소비량을 계산해서 차감하는 메서드는 비공개 메서드로 만들고 스킬을 쓰는 메서드는 공개 메서드로 만든다. 만약 마나를 차감하는 메서드가 공개되어 있다면 마음대로 차감시킬 수 있으므로 잘못된 클래스 설계가 된다.
'Programming > Python' 카테고리의 다른 글
[클래스] 정적메서드 사용하기 (0) | 2023.03.13 |
---|---|
[클래스] 클래스 속성과 인스턴스 속성 알아보기 (0) | 2023.03.13 |
[클래스] 속성 사용하기 (0) | 2023.03.12 |
[클래스] Class 사용하기 (0) | 2023.03.12 |
모듈/패키지/라이브러리 (0) | 2022.03.31 |