Python - 클래스(Class) 이해하기

0

python 기초

목록 보기
1/3
post-thumbnail

개발을 하다보면 어느덧 프로그램이 커지고, 더이상 함수만 가지고는 다양한 데이터를 다룰 수가 없게 됩니다. 함수1에서 설정한 변수를 함수2에서 사용하고 싶으면 다시 작성해야합니다. 그래서 클래스 구조를 설계하면 코드의 반복을 최소화할 수 있고, 데이터 중심으로 객체들 간의 정보를 주고받을 수 있는 장점이 있습니다. 그래서 클래스에 대해서 공부하면서 클래스가 어떤 방식으로 구조화되는지 살펴보려고 합니다. 여기서는 쿠키런 킹덤 게임 캐릭터 예시를 통해서 클래스를 이해합니다.

쿠키런 킹덤 게임에 접속하여 계정을 생성하려고 합니다. 그럼 먼저 계정을 생성하는 클래스를 작성합니다.


class Account():
    greeting = "안녕하세요, 반갑습니다." # 클래스 변수, 모든 인스턴스에서 공유하는 값

    def __init__(self, user_name):
        self.user_name = user_name
        print(f'{self.user_name}{Account.greeting}')
        self.money = 10000

    def add_inventory(self, cookie):
        self.cookies = []
        self.cookies.append(cookie)

    def acc_status(self):
        print(f'{self.user_name}님의 남은 돈: {self.money}원')
  • 속성(attribute): 위에서 설정한 greeting은 클래스 속성(attribute)이라고 합니다. Account 클래스로 만든 모든 인스턴스가 이 변수를 공유할 수 있습니다.

  • 메서드(method): 그리고 클래스 내부의 함수들은 메서드라고 부르는데, 메서드 안에 self.user_name과 같은 변수를 인스턴스 속성이라고 합니다. 인스턴스 속성은 self를 통해 할당된 인스턴스만의 변수를 의미합니다.

  • 생성자(constructor): def init( ): init 메서드는 생성자라고 하는데, 클래스를 생성할 때 자동으로 어떤 함수나 값을 실행하고 싶을 때 설정합니다. Account 클래스를 생성하기 위해서는 user_name 값을 넣어서 생성해야 합니다.

Account 클래스에는 '인벤토리(add_inventory)'와 '계정 정보(acc_status)' 메서드가 구현되었습니다.
저는 블루베리왕국으로 계정을 생성했고, 친구는 홀리베리왕국으로 계정을 생성하였습니다.


input:

my_kingdom = Account('블루베리왕국')
my_kingdom2 = Account('홀리베리왕국')
print(my_kingdom.money)
print(my_kingdom2.money)
output:

블루베리왕국님 안녕하세요, 반갑습니다.
홀리베리왕국님 안녕하세요, 반갑습니다.
10000
10000

계정을 생성하면 고유 계정에 맞게 인사가 프린트 됩니다.
각 계정에는 초기 자금이 들어 있습니다.

이제 과금을 해서 쿠키 캐릭터들을 뽑으려고 합니다. 쿠키 클래스를 만들어 봅니다.


class Cookie(): 
    def __init__(self, hello:str, name:str, atk:int, DEF:int, hp:int, skill:str, skill_dmg:float, kingdom:Account):
        self.level = 1 # self.속성1 = 값
        self.hello = hello # self.속성2 = 매개변수1
        self.name = name #self.속성3 = 매개변수2
        self.atk = atk
        self.DEF = DEF
        self.hp = hp
        self.skill = skill
        self.skill_dmg = skill_dmg
        kingdom.add_inventory(name) # 계정에 쿠키를 추가합니다.

    def call_status(self):
        print(f'이름: {self.name}')
        print(f'레벨: {self.level}')
        print(f'공격력: {self.atk}')
        print(f'방어력: {self.DEF}')
        print(f'체력: {self.hp}')
        print(f'스킬데미지: {self.skill_dmg}')       

    def say_hello(self):
        print(f'{self.name}: {self.hello}')

    def cast_skill(self):
        print(f'casting: {self.name}: {self.skill}')

Cookie 클래스를 만들었습니다. 쿠키를 뽑으면 고유한 개인 계정에 귀속되므로 init 매개변수로 위에서 만든 계정 인스턴스를 받습니다.
쿠키를 뽑으면 init 메서드에서 Account 클래스의 add_inventory 메서드가 실행되며 인벤토리에 뽑은 쿠키가 추가됩니다.
추가로 쿠키들의 스텟 정보와 인사말, 스킬 메서드를 구현하였습니다.
level 속성은 초기에 무조건 1이기에 매개변수를 받아서 저장하지 않습니다.
간단하게 쿠키 능력치를 몇 개 적어서 쿠키를 소환해봅니다...


input:

cocoa = Cookie('코코아 한 잔 더', '코코아맛 쿠키', 10, 50, 100, '코코아 너무 좋아!', 150.5, my_kingdom)
hub = Cookie('반가워 햇살', '허브맛 쿠키', 5, 10, 70, '무럭무럭 자라라!', 50.5, my_kingdom2)
print(f'내 계정 쿠키:{my_kingdom.cookies}')
print(f'친구 계정 쿠키:{my_kingdom2.cookies}')
cocoa.call_status()
hub.call_status()
output:

내 계정 쿠키:['코코아맛 쿠키']
친구 계정 쿠키:['허브맛 쿠키']

이름: 코코아맛 쿠키
레벨: 1
공격력: 10
방어력: 50
체력: 100
스킬데미지: 150.5

이름: 허브맛 쿠키
레벨: 1
공격력: 5
방어력: 10
체력: 70
스킬데미지: 50.5

쿠키 인스턴스를 생성해서 쿠키를 뽑았습니다. 제 계정에는 코코아맛 쿠키가, 친구 계정에는 허브맛 쿠키가 추가되었네요.
그럼 이제 뽑은 쿠키 캐릭터를 키워볼까요? 레벨업 클래스를 만들어 봅니다.


class LevelSystem():
    def __init__(self, cookie: Cookie, kingdom: Account):
        self.cookie = cookie
        self.kingdom = kingdom

    def level_up(self, num):
        self.cookie.level = self.cookie.level + num 
        self.cookie.atk = (self.cookie.atk + 20) * num 
        self.cookie.DEF = (self.cookie.DEF + 30) * num 
        self.cookie.hp = (self.cookie.hp + 50) * num 
        self.kingdom.money += -1000*num
        return self.cookie.level, self.cookie.atk, self.cookie.DEF, self.cookie.hp
    
    def skill_up(self, num):
        self.cookie.skill_dmg = (self.cookie.skill_dmg + 100) * num
        self.kingdom.money += -500*num
        return self.cookie.skill_dmg

init 메서드로 만들어진 쿠키와 계정 정보를 받습니다.
level_up과 skill_up 메서드를 만들었습니다.

이제 LevelSystem 클래스의 인스턴스를 생성해봅니다. 그리고 만들어 놓은 쿠키와 계정을 넣고 레벨업을 시키겠습니다.


input:

level_system = LevelSystem(cocoa, my_kingdom) # LevelSystem 인스턴스 생성
level_system2 = LevelSystem(hub, my_kingdom2)

level_system.level_up(5) # 쿠키 레벨업
level_system2.skill_up(2) # 쿠키 스킬업

cocoa.call_status() # 쿠키 정보
hub.call_status()

print(my_kingdom.acc_status()) # 계정 정보
print(my_kingdom2.acc_status())
output:

이름: 코코아맛 쿠키
레벨: 6
공격력: 150
방어력: 400
체력: 750
스킬데미지: 150.5

이름: 허브맛 쿠키
레벨: 1
공격력: 5
방어력: 10
체력: 70
스킬데미지: 301.0

블루베리왕국님의 남은 돈: 5000원
홀리베리왕국님의 남은 돈: 9000

실행 결과를 봅시다. 레벨업을 하니깐 쿠키 캐릭터들의 정보가 바뀌었습니다. 레벨업을 하면 천 원이 차감되고, 스킬업을 하면 500원이 차감됩니다. 코코아맛 쿠키는 +5레벨업을 해서 블루베리왕국은 5천 원이 남았고, 허브맛 쿠키는 +2스킬업을 해서 홀리베리왕국은 5천 원이 남았습니다.

클래스에 대한 이해가 조금 상승했습니다 :D

profile
나 응애👶 개발자, 딥린이👨‍💻, 언어 연구자 👨‍🎓

0개의 댓글