티스토리 뷰

클래스 내에서 정의된 변수를 멤버변수라고 하며 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))

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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
글 보관함