티스토리 뷰
클래스 내에서 정의된 변수를 멤버변수라고 하며 self. 와 함께 사용할 수 있습니다. Unit 클래스의 경우 name, hp, damage 가 멤버변수가 되며 클래스 내에서는 self.name 과 같은 방식으로 값을 설정하고 사용합니다.
class Unit:
def __init__(self, name, hp, damage): # 3개의 전달값
self.name = name # 멤버변수 name
self.hp = hp # 멤버변수 hp
self.damage = damage # 멤버변수 damage
print("{0} 유닛이 생성되었습니다.".format(self.name))
print("체력 {0}, 공격력 {1}".format(self.hp, self.damage))
새로운 유닛을 하나 만들어보겠습니다. 이번에 만들 유닛은 하늘을 날아다니는 전투기 같은 공중 유닛이고 이름은 레이스인데요. 레이스는 클로킹이라는 특수한 기능이 있는데 이 기능을 쓰면 상대방이 볼 수가 없습니다. 하지만 클로킹은 그냥 쓸 수는 없고 먼저 게임 내 재화를 지불하여 업그레이드라는 작업을 해야합니다.
유닛 생성은 지금까지와 동일한 방식으로 하고, 이번에는 클래스 생성자나 메소드가 아닌 곳에서 멤버변수 정보를 출력해보겠습니다. 클래스 내에서는 self. 과 같이 멤버변수에 접근할 수 있었는데 객체를 통해 접근할 때에는 객체 이름 뒤에 점(.) 을 찍고 멤버변수 이름을 적으면 됩니다.
# 레이스 : 공중 유닛, 비행기. 클로킹 (상대방에게 보이지 않음)
wraith1 = Unit("레이스", 80, 5) # 체력 80, 공격력 5
print("유닛 이름 : {0}, 공격력 : {1}".format(wraith1.name, wraith1.damage)) # 멤버변수 접근
객체 이름이 wraith1 이므로 이 객체가 가지는 멤버변수는 wraith1.name 과 wraith1.damage 같이 접근하여 값을 출력하였습니다. 실행 결과는 다음과 같습니다.
레이스 유닛이 생성되었습니다. 체력 80, 공격력 5 유닛 이름 : 레이스, 공격력 : 5 |
스타크래프트의 세 종족 중에서 외계인을 담당하고 있는 프로토스에는 다크 아칸이라는 마법사가 있습니다. 이 유닛은 마인드 컨트롤이라는 특수 기능을 통해 적군의 유닛을 빼앗을 수 있지요.
편의상 우리 편에 다크 아칸이 하나 있고 적군의 레이스를 하나 빼앗는다고 가정하겠습니다. 이제 이 레이스는 우리 것이 되므로 wraith2 라는 이름으로 관리하겠습니다.
# 마인드 컨트롤 : 상대방 유닛을 내 것으로 만드는 것 (빼앗음)
wraith2 = Unit("빼앗은 레이스", 80, 5)
그런데 레이스를 빼앗고 보니 클로킹 기능이 벌써 업그레이드가 되어 있었네요! 아직 우리 진영의 레이스들은 클로킹 기능을 쓸 수 없는데 빼앗은 레이스는 기능 개발이 되어 있으므로 클로킹을 한 번 써보겠습니다.
Unit 클래스의 멤버 변수에는 name, hp, damage 만 있어서 클로킹 상태를 관리할 수가 없으므로 빼앗은 레이스만을 위한 특별한 멤버 변수를 하나 정의하겠습니다. 이름은 cloaking 이라고 하고 True 일 땐 클로킹 상태, False 일 땐 일반 상태라고 하죠.
wraith2.cloaking = True # 빼앗은 레이스만을 위한 특별한 멤버변수 정의
빼앗은 레이스만을 위한 cloaking 변수를 만듦과 동시에 True 라고 값을 설정하여 클로킹 상태로 변경합니다. 그리고 다음 줄에서 클로킹 상태로 잘 되었는지 확인을 해볼게요.
if wraith2.cloaking == True: # 클로킹 상태라면?
print("{0}는 현재 클로킹 상태입니다.".format(wraith2.name))
실행 결과를 보니 올바르게 클로킹 상태가 되었습니다.
지금까지 작성된 전체 코드.빼앗은 레이스는 현재 클로킹 상태입니다. |
그런데 우리가 직접 만든 레이스의 클로킹 여부도 확인해볼 수 있을까요? 우리가 만든 레이스는 wraith1 이었으니 위와 같은 방식으로 코드를 작성 후 실행해보겠습니다.
if wraith1.cloaking == True: # 우리가 만든 레이스 클로킹 여부
print("{0}는 현재 클로킹 상태입니다.".format(wraith1.name))
실행을 하니 다음과 같이 에러가 발생하네요.
AttributeError: 'Unit' object has no attribute 'cloaking' |
그렇습니다. Unit 클래스에는 처음과 변함 없이 name, hp, damage 라는 3개의 멤버변수가 있고 cloaking 은 없는데 우리가 만든 wraith1 에서 아직 정의되지 않은 cloaking 변수에 접근을 하려다보니 에러가 나는 것입니다. 반면에 wraith2 는 클래스 외부에서 직접 cloaking 이라는 멤버 변수를 정의하였고 이는 모든 Unit 객체가 아닌 오직 빼앗은 wraith2 에만 해당되므로 wraith2.cloaking 을 통해 값 비교를 하는 데에는 아무런 문제가 없었습니다.
wraith1 의 멤버 변수 | wraith2 의 멤버 변수 |
name | name |
hp | hp |
damage | damage |
- | cloaking |
이와 같이 클래스로부터 객체를 만든 다음 그 객체만을 위한 멤버 변수 정의가 필요한 경우에는 클래스 외부에서 별도로 정의할 수 있으며, 이 때 이 객체를 제외한 다른 객체들은 새로 정의된 멤버 변수를 알지 못하며 사용할 수도 없습니다. 오직 이 객체만을 위한 멤버변수가 되는 것입니다.
지금까지 작성된 전체 코드는 다음과 같습니다.
class Unit:
def __init__(self, name, hp, damage):
self.name = name
self.hp = hp
self.damage = damage
print("{0} 유닛이 생성되었습니다.".format(self.name))
print("체력 {0}, 공격력 {1}".format(self.hp, self.damage))
# 레이스 : 공중 유닛, 비행기. 클로킹 (상대방에게 보이지 않음)
wraith1 = Unit("레이스", 80, 5) # 체력 80, 공격력 5
print("유닛 이름 : {0}, 공격력 : {1}".format(wraith1.name, wraith1.damage)) # 멤버변수 접근
# 마인드 컨트롤 : 상대방 유닛을 내 것으로 만드는 것 (빼앗음)
wraith2 = Unit("빼앗은 레이스", 80, 5)
wraith2.cloaking = True # 빼앗은 레이스만을 위한 특별한 멤버변수 정의
if wraith2.cloaking == True: # 클로킹 상태라면?
print("{0}는 현재 클로킹 상태입니다.".format(wraith2.name))
# 에러 발생
# if wraith1.cloaking == True: # 우리가 만든 레이스 클로킹 여부
# print("{0}는 현재 클로킹 상태입니다.".format(wraith1.name))
'파이썬 강의 > 기본편' 카테고리의 다른 글
[파이썬 기본편] 9-5.상속 (1) | 2021.03.10 |
---|---|
[파이썬 기본편] 9-4.메소드 (1) | 2021.03.09 |
[파이썬 기본편] 9-2.__init__ (0) | 2021.03.07 |
[파이썬 기본편] 9-1.클래스 (4) | 2021.03.06 |
[파이썬 기본편] 8-6.퀴즈 #7 (10) | 2021.03.05 |
- Total
- Today
- Yesterday
- 코랩
- vscode
- pygame
- 파이썬
- Tkinter
- onlineclass
- 비주얼 스튜디오 코드
- Unity
- ChatGPT
- 행맨
- game
- Xcode
- 나도코딩
- Visual Studio Code
- c언어
- Colab
- 챗GPT
- 환경설정
- Coding
- Mac
- 파이게임
- 주피터노트북
- coloso
- pycharm
- GUI
- 아나콘다
- repl.it
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |