Rylah's Study & Daily Life

[Python Basic] 09. 클래스, Initialize(생성자), 멤버 변수, 메소드 본문

Study/Python Basic

[Python Basic] 09. 클래스, Initialize(생성자), 멤버 변수, 메소드

Rylah 2022. 1. 19. 16:10
# 1. 클래스
# 마린 : 공격 유닛 , 군인, 총을 쏠 수 있음
name = "마린" # 유닛의 이름
hp = 40 # 유닛의 체력
damage = 5 # 유닛의 공격력

print(f"{name} 유닛이 생성되었습니다.")
print(f"체력 {hp}, 공격력 {damage}\n")

# 탱크 : 공격 유닛, 탱크, 포를 쏠 수 있는데, 일반 모드 / 시즈 모드
tank_name = "탱크"
tank_hp = 150
tank_damage = 35
print(f"{tank_name} 유닛이 생성되었습니다.")
print(f"체력 {tank_hp}, 공격력 {tank_damage}\n")

tank2_name = "탱크"
tank2_hp = 150
tank2_damage = 35
print(f"{tank2_name} 유닛이 생성되었습니다.")
print(f"체력 {tank2_hp}, 공격력 {tank2_damage}\n")


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


attack(name,"1시",damage)
attack(tank_name,"1시",tank_damage)
attack(tank2_name,"1시",tank2_damage)

# 하지만 이런 방법은 매우 비효율적이다.
print()
print()

# 클래스는 하나의 틀이다. 변수와 함수들의 집합이라고 생각해도 된다.

class Unit:
    def __init__(self, name, hp, damage): # 클래스 생성자
        self.name = name
        self.hp = hp
        self.damage = damage
        print(f"{self.name} 유닛이 생성되었습니다.")
        print(f"체력 {self.hp}, 공격력 {self.damage}")


marine1 = Unit("마린", 40, 5)
marine2 = Unit("마린", 40, 5)
tank = Unit("탱크", 150, 35)

# 2. __init__
class Unit:
    def __init__(self, name, hp, damage): # 클래스 생성자
        self.name = name
        self.hp = hp
        self.damage = damage
        print(f"{self.name} 유닛이 생성되었습니다.")
        print(f"체력 {self.hp}, 공격력 {self.damage}")


# 클래스로 만들어지는 것 : 객체
# 마린, 탱크 = 인스턴스
marine1 = Unit("마린", 40, 5)
marine2 = Unit("마린", 40, 5)
tank = Unit("탱크", 150, 35)

#marine3 = Unit("마린") # 오류
#marine3 = Unit("마린", 40) #오류

# 3. 멤버 변수
# 클래스 내에 정의 된 변수들을 통침함
class Unit:
    def __init__(self, name, hp, damage): # 클래스 생성자
        self.name = name
        self.hp = hp
        self.damage = damage
        print(f"{self.name} 유닛이 생성되었습니다.")
        print(f"체력 {self.hp}, 공격력 {self.damage}")

# 레이스 : 공중 유닛, 비행기. 클로킹(상대방에게 보이지 않음)
wraith1 = Unit("레이스", 80, 5)
print("유닛 이름은 {0}, 공격력 : {1}".format(wraith1.name, wraith1.damage))

# 마인드 컨트롤 : 상대방 유닛을 내 것으로 만드는 것 (빼앗음)
wraith2 = Unit("빼앗은 레이스", 80, 5)
wraith2.clocking = True

# 파이썬에서는 객체에 외부에서 변수를 추가로 할당해서 사용할 수 있다.
# 하지만 각 객체마다 따로 있을 수 있는 거라 연결된 클래스에서 만들어진 다른 객체에서 사용할 수는 없다.
if wraith2.clocking == True:
    print(f"{wraith2.name}는 현재 클로킹 상태입니다.")

# 4. 메소드
class Unit:
    def __init__(self, name, hp, damage): # 클래스 생성자
        self.name = name
        self.hp = hp
        self.damage = damage
        print(f"{self.name} 유닛이 생성되었습니다.")
        print(f"체력 {self.hp}, 공격력 {self.damage}")

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

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

        if self.hp <= 0:
            print(f"{self.name} : 파괴되었습니다.")

# 파이어뱃 : 공격 유닛, 화염 방사기
firebat1 = AttackUnit("파이어뱃", 50, 16)
firebat1.attack("5시")

# 공격을 두번 받는다고 가정
firebat1.damaged(25)
firebat1.damaged(25)