ko ko ko en en en ko ko cs zh ko ko ko ko ko ko ko en ko ko ko ko ko ko pt ko ko ko ko ko pt ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko ko fr ko ko ko ko fr ko ko ko en en ko en zh en en
파이썬 코딩 도장: 34.3 비공개 속성 사용하기
◀ 34.2 속성 사용하기34.4 퀴즈 ▶︎
앞에서 만든 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을 넣어보겠습니다. 다음 내용을 IDLE의 소스 코드 편집 창에 입력한 뒤 실행해보세요.
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    # 클래스 바깥에서 비공개 속성에 접근하면 에러가 발생함
Traceback (most recent call last):   File "C:\project\class_private_attribute_error.py", line 9, in       maria.__wallet -= 10000    # 클래스 바깥에서 비공개 속성에 접근하면 에러가 발생함 AttributeError: 'Person' object has no attribute '__wallet'
실행을 해보면 에러가 발생합니다. 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('이제 {0}원 남았네요.'.format(self.__wallet))   maria = Person('마리아', 20, '서울시 서초구 반포동', 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()    # 에러: 클래스 바깥에서는 비공개 메서드를 호출할 수 없음
비공개 메서드도 메서드를 클래스 바깥으로 드러내고 싶지 않을 때 사용합니다. 보통 내부에서만 호출되어야 하는 메서드를 비공개 메서드로 만듭니다. 예를 들어 게임 캐릭터가 마나를 소비해서 스킬을 쓴다고 치면 마나 소비량을 계산해서 차감하는 메서드는 비공개 메서드로 만들고, 스킬을 쓰는 메서드는 공개 메서드로 만듭니다. 만약 마나를 차감하는 메서드가 공개되어 있다면 마음대로 마나를 차감시킬 수 있으므로 잘못된 클래스 설계가 됩니다.
◀ 34.2 속성 사용하기34.4 퀴즈 ▶︎
Unit 1. 소프트웨어 교육과 파이썬
Unit 2. 파이썬 설치하기
Unit 3. Hello, world!로 시작하기
Unit 4. 기본 문법 알아보기
Unit 5. 숫자 계산하기
Unit 6. 변수와 입력 사용하기
Unit 7. 출력 방법 알아보기
Unit 8. 불과 비교, 논리 연산자 알아보기
Unit 9. 문자열 사용하기
Unit 10. 리스트와 튜플 사용하기
Unit 11. 시퀀스 자료형 활용하기
Unit 12. 딕셔너리 사용하기
Unit 13. if 조건문으로 특정 조건일 때 코드 실행하기
Unit 14. else를 사용하여 두 방향으로 분기하기
Unit 15. elif를 사용하여 여러 방향으로 분기하기
Unit 16. for 반복문으로 Hello, world! 100번 출력하기
Unit 17. while 반복문으로 Hello, world! 100번 출력하기
Unit 18. break, continue로 반복문 제어하기
Unit 19. 계단식으로 별 출력하기
Unit 20. FizzBuzz 문제
Unit 21. 터틀 그래픽스로 그림 그리기
Unit 22. 리스트와 튜플 응용하기
Unit 23. 2차원 리스트 사용하기
Unit 24. 문자열 응용하기
Unit 25. 딕셔너리 응용하기
Unit 26. 세트 사용하기
Unit 27. 파일 사용하기
Unit 28. 회문 판별과 N-gram 만들기
Unit 29. 함수 사용하기
Unit 30. 함수에서 위치 인수와 키워드 인수 사용하기
Unit 31. 함수에서 재귀호출 사용하기
Unit 32. 람다 표현식 사용하기
Unit 33. 클로저 사용하기
Unit 34. 클래스 사용하기
34.1 클래스와 메서드 만들기
34.3 비공개 속성 사용하기
34.5 연습문제: 게임 캐릭터 클래스 만들기
34.6 심사문제: 게임 캐릭터 클래스 만들기
Unit 35. 클래스 속성과 정적, 클래스 메서드 사용하기
Unit 36. 클래스 상속 사용하기
Unit 37. 두 점 사이의 거리 구하기
Unit 38. 예외 처리 사용하기
Unit 39. 이터레이터 사용하기
Unit 40. 제너레이터 사용하기
Unit 41. 코루틴 사용하기
Unit 42. 데코레이터 사용하기
Unit 43. 정규표현식 사용하기
Unit 44. 모듈과 패키지 사용하기
Unit 45. 모듈과 패키지 만들기
Unit 46. 실전예제: 웹의 데이터로 그래프 그리기
C 언어 코딩 도장
- 이 사이트에 실린 모든 내용, 디자인, 이미지, 편집 구성의 저작권은 (주)도서출판 길벗과 지은이에게 있습니다.
- 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다.
- 책의 내용을 복제하여 블로그, 웹사이트 등에 게시할 수 없습니다.
- 링크, SNS 공유는 허용합니다.
서울시 마포구 서교동 월드컵로 10길 56 (서울시 마포구 서교동 467-9)
Copyright © 2016-2021 Coding Dojang