본문 바로가기
지식공학/Python

Python 독학 기본편 #9 Class (feat. 어벤저스 공격!!)

by Eric87 2020. 10. 20.
반응형

이번 파이썬 내용은 중요합니다. 어려울 수도 있는데 최대한 자히 설명하도록 하겠습니다.

Class에 대한 개념부터 집고 넘어가도록 하겠습니다. 클래스는 이름처럼 어떠한 연관이 있는 함수들을 모아놓은 집합이라고 할 수 있습니다. 이전에 배운 함수 def를 정의해두고 이 함수를 하나로 묶는 개념입니다. 이렇게 묶은 함수를 서로 연결시킬 수 있고 추가할 수도 있죠. 다라서 class에 활용도는 매우 높습니다.

사람들이 알고 있는 어벤저스 히어로들로 예를 들겠습니다. class를 활용하지 않고 일반 지금까지 배웠던 변수로 정의할 수 있습니다.

name = "호크아이"
hp = 400
damage = 10
print("{0}가 출현했습니다.".format(name))
print("체력 {0}, 공격력 {1}\n".format(hp, damage))

hulk_name = "헐크"
hulk_hp = 1000
hulk_damage = 50
print("{0}가 출현했습니다.".format(hulk_name))
print("체력 {0}, 공격력 {1}\n".format(hulk_hp, hulk_damage))

이렇게 출력을 하면 되는데 변수가 너무 많아져서 관리하기가 힘들어집니다. 함수를 이용해서 값을 출력하려고 하면 각각의 변수에다 함수를 입력시키고 각각을 출력해 주어야 합니다. 개념은 쉽지만 코드가 복잡해져서 코드 관리도 힘들어집니다.

def attack(name, location, damage):
     print("{0}:{1} 방향으로 적군을 공격합니다. [공격력 {2}]".format(name, location, damage))

attack(name, "1시", damage)
attack(hulk_name, "1시", hulk_damage)

하지만 Class를 활용하면 하나의 변수에 반복되는 정보를 넣을 수 있기 때문에 간편해집니다.

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))

member1 = Unit("호크아이", 400,10)
member2 = Unit("헐크", 1000,50)
member3 = Unit("아이언맨",600, 35)

이렇게 멤버의 번호를 붙이고 각 멤버의 고유한 이름과 체력, 공격력 정보를 넣음으로써 관리하기가 편리해지는 것입니다. class 다음에 class의 이름을 만들어 주고 def로 함수를 선언한 뒤 두 번의 under bar+init+두 번의 under bar는 초기화를 시켜준다고 생각하면 됩니다. class를 선언한 뒤 객체를 생성한다고 보면 됩니다. self는 반드시 넣어주고 멤버의 변수를 원하는 만큼 넣습니다.

class Unit:
def __init__(self,멤버변수,멤버변수,멤버변수,멤버변수,.... ):

이것이 class의 기본 폼(form)이라고 생각하면 됩니다. 그럼 우리는 멤버 1,2,3으로 호크아이와 헐크, 아이언맨을 불러왔습니다. 추가로 네 번째 멤버 버키도 호출해보겠습니다. 여기에 버키는 세뇌가 되는 기능을 추가할 수 있습니다.

member4 = Unit("버키", 500,10)
print("유닛 이름: {0}, 공격력 : {1}".format(member4.name, member4.damage))
member4.brainwash = True
if member4.brainwash == True:
     print("{0}은 현재 세뇌 되었습니다.".format(member4.name))

다른 멤버 말고 하나의 멤버에게 특정 기능을 추가할 수 있게 된 것입니다.

이번에는 다른 class에 여러 함수를 추가시켜 보겠습니다. 호출한 어벤저스들이 적을 공격을 하도록 명령을 내리고 전투 중에 피해를 입은 상황을 표시하도록 하겠습니다. 공격 함수를 선언해서 1시 방향으로 공격을 하고, 피해를 받다가 체력이 0이 되면 죽게 되는 코드입니다.

class AttackUnit:
     def __init__(self, name, hp, damage):
          self.name = name
          self.hp = hp
          self.damage = damage
     def attack(self, location):
          print("{0} : {1} 방향으로 적군을 공격 합니다. [공격력 {2}]".format(self.name, location, self.damage))
     def damaged(self, damage):
          print("{0} : {1} 데미지를 입었습니다.".format(self.name, damage))
          self.hp -= damage
          print("{0} : 현재 체력은 {1} 입니다.".format(self.name, self.hp))
          if self.hp <= 0:
               print("{0} : 죽었습니다.".format(self.name))

member1 = AttackUnit("호크아이",400,10)
member1.attack("6시")

member1.damaged(200)
member1.damaged(200)

AttackUnit이라는 새로운 class를 만들고 객체를 생성한 뒤 attack과 damaged라는 함수를 만들었습니다. 호크아이가 6시 방향으로 공격을 하고 대미지를 입어 죽었다는 상황입니다.

다음에는 각 class를 연결시켜 활용해보겠습니다. 앞에서 class unit과 attackunit을 만들었습니다. 두 class를 다음과 같이 연결시킬 수 있습니다.

class Unit:
     def __init__(self, name, hp):
          self.name = name
          self.hp = hp

class AttackUnit(Unit):
     def __init__(self, name, hp, damage):
          Unit.__init__(self, name, hp)
          self.damage = damage

보시면 AttackUnit이라는 class에 이전 Unit class를 불러와서 추가가 되었습니다. 즉, AttackUnit은 Unit을 포함하게 된것입니다. 이후 공중을 날 수 있는 히어로를 부르기 위해 Flyable이라는 class를 만들고 FlyableAttackUnit로 연결시켜보겠습니다.

class Flyable:
    def __init__(self, flying_speed):
         self.flying_speed = flying_speed

     def fly(self, name, location):
         print("{0} : {1} 방향으로 날아갑니다. [속도 {2}]".format(name, location, self.flying_speed))

class FlyableAttackUnit(AttackUnit, Flyable):
     def __init__(self, name, hp, damage, flying_speed):
         AttackUnit.__init__(self, name, hp, damage)
         Flyable.__init__(self, flying_speed)

Flyable class에서 속도 값을 정의해주고 AttackUnit과 Flyable를 합하여 FlyableAttackUnit이라는 최종 class로 통합하였습니다. 날 수 있는 히어로 팔콘(falcon)이라 이름을 정하고 체력은 200, 공격력은 60, 이동속도는 5로 주었습니다. 그리고 팔콘에게 3시방향으로 날아가라는 명령어를 주었습니다.

공중 유닛만 이동하는 것이 아니라 날지 못하는 유닛도 이동할 수 있으니 이동능력을 Unit class에 추가 시켜보겠습니다. 기존에 작성되어 있는 Unit과 AttackUnit을 다음과 같이 바꿔줍니다.

class Unit:
     def __init__(self, name, hp, speed):
          self.name = name
          self.hp = hp
          self.speed = speed
     def move(self, location):
          print("[지상 이동]")
          print("{0} : {1} 방향으로 이동합니다. [속도 {2}]".format(self.name, location, self.speed))

class AttackUnit(Unit):
     def __init__(self, name, hp, speed, damage):
          Unit.__init__(self, name, hp, speed)
          self.damage = damage

마지막으로 FlyableAttackUnit에서는 지상 이동이 필요없으니 해당 class에 들어올 때만 지상이동은 0이라고 정의를 해주기 위해 다음과 같이 수정을 해줍니다.

class FlyableAttackUnit(AttackUnit, Flyable):
     def __init__(self, name, hp, damage, flying_speed):
          AttackUnit.__init__(self, name, hp, 0, damage)
          Flyable.__init__(self, flying_speed)

이렇게 세 가지 class를 수정해 주고 지상유닛 캡틴과 공중유닛인 비전을 만들어줍니다.

captin = AttackUnit("캡틴", 500, 5, 100)
vision = FlyableAttackUnit("비전", 1000, 200, 50)
captin.move("11시")
vision.fly(vision.name, "9시")

위 예제의 class를 정리하면 다음 그림과 같습니다.

 

반응형

댓글