본문 바로가기

Python

[Python] Class에 대한 이해

전쟁 게임이 만든다고 가정하자.

전쟁에서는 최대한 많은 병사를 빠르게 뽑아서 적을 이겨야 한다.

그래서 전쟁 게임의 기초를 만드는데

name = "보병"
hp = 40
damage = 5

위와 같은 코드로 병사를 만드려고 한다.

하지만 병사들은 역할에 따라서 hp와  damage를 다르게 게임을 만들거다.

그럴때마다 똑같은 코드로 계속 만들어야 하는가?

 

Class

클래스를 쉽게 비유하자면 사람들은 붕어빵 틀에 비유하곤 한다.

틀에다가 반죽과 속재료를 넣고 붕어빵을 만드는데 여기서 속재료가 팥인지 슈크림인지 틀은 아무 상관이 없다.

class 클래스명:
    def 메소드명1(self, 전달값1, 전달값2):
        실행 명령
        실행 명령2
   
    def 메소드명2(self, 전달값1, 전달값2):
        실행 명령
        실행 명령2

클래스의 기본 구조는 다음과 같다.

먼저 클래스의 명칭은 보통 파스칼 표기법을 쓴다.

그리고 클래스 안의 필요한 함수를 정의하는데, 이 함수를 메소드라고한다.

그렇다면 이 구조를 이용하여 위의 함수로 클래스를 만들어보자.

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

soldier1 = Soldier("보병", 40, 5)
soldier2 = Soldier("기마병", 150, 15)

메소드안의  정의한 변수를 인스턴스 변수라고 하는데,

위의 클래스를 만들어두면 코드를 하나하나 칠 필요가 없이 병사를 만들 수 있다.

soldier1 = Solidier("보병", 40, 5) 와 같은 코드로 만들어진 병사를 클래스의 인스턴스라고 한다.

__init__()은 생성자라고 하는데 객체를 생성할 때 호출하지 않아도 자동으로 호출되는 메소드다.

하지만 self는 반드시 넣어줘야 한다.

 

상속

게임에 병사만 있으면 쉽게 결판이 나지 않고 재미가 떨어질 수도 있다.

이번에는 공격하기 좋게 탱크를 하나 만들어보자.

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

class Tank(Soldier):
    def __init__(self, name, hp, damage, shield):
        super().__init__(name, hp, damage)
        self.shield = shield

위의 코드에서 탱크는 name, hp, damage말고도 shield를 넣어서 더욱 강력하다는 것을 표현해준다.

그렇다면 또 클래스를 만든다고  name, hp, damage도 다시 넣어줘야 하는가.

이때 쓰는 것이 바로 super()이다

부모의 재산을 물려받는 것처럼 상위의 클래스에서 공통된 부분을 받아와서 사용하는 것이다.

이렇게 하면 Soldier의 인스턴스 변수를 그대로 가져와서 사용할 수 있다.


클래스를 공부하면서 어려운 내용이 있어서 다시 정리해보려고 글을 작성했다.

다른 정보 블로그들이 쓰는 것 처럼 작성해보고 싶었는데 짧게 쓰려다 보니 내용이 부실해 진 것 같다.