(나도코딩의 파이썬 입문) 9장. 클래스(p.257 ~ p.276)

2023. 3. 6. 15:39독서

반응형

안녕하세요!

<코딩 자율학습 나도코딩의 파이썬 입문> 멘토를 담당하게 된 이안입니다.

 

오늘은 9장 '클래스'에 대해 이어서 학습할게요!

'클래스'라는 것을 공부하는 것 만으로도 많은 정보가 들어오니 오늘은 2 챕터만 나갈게요.

 

오늘 공부할 내용은 다음과 같습니다.

 

🧐 공부할 내용(p.257 ~ p.276)

  • 게임 소개
  • 클래스와 객체 생성하기

 

1.  게임 소개


이 파트를 읽으시면서 중점적으로 보셔야 할 것은 공통 사항에 어떤 것들이 있는지를 살펴보셔야 해요.

 

먼저 "이름", "hp", "damage"라는 공통 사항이 있죠

 

그리고 "damage"라는 것은 공격력이기 때문에 공격을 할 수도 있을 거예요.

 

 

즉, 공통사항으로 꼽아보면

 

이름, 체력, 공격력, 그리고 공격하는 행동까지가 공통 사항이라고 할 수 있어요.

 

 

이런 공통사항은 클래스를 배우는데 매우 중요해요.

 

클래스의 기초는 공통사항에서 오거든요.

 

 

그럼 이를 기반으로 클래스와 객체를 생성하러 가볼게요!

 

 

2. 클래스와 객체 생성하기


책의 예시처럼 클래스와 객체의 관계는 붕어빵과 붕어빵 틀의 관계입니다.

 

그리고 이전에 말씀드린대로 클래스 안에 정의하는 함수를 메서드라고 합니다.

 

이전에 str자료형에서 사용되는 함수도 메서드 입니다.

str클래스 안에 정의된 함수니까요!

 

또 메서드 안에 정의된 변수를 인스턴스 변수라고 합니다.

 

한번 클래스를 작성해보죠.

 

class Unit:
    def __init__(self, name: str, hp: int, damage: int) -> None:
        self.name = name
        self.hp = hp
        self.damage = damage
        print(f"{self.name} 유닛을 생성되었습니다.")
        print(f"체력 {self.hp}, 공격력 {self.damage}")
        

# 객체 생성
marine = Unit("마린", 40, 5)

 

이렇게 만들어진 class로 생성된 유닛을 "객체"라고 합니다.

 

즉, marine은 객체인 것이죠. 그리고 이를 Unit 클래스의 인스턴스라고 합니다.

 

그럼 하나씩 차근차근 알아가보죠.

 

1) 생성자

생성자는 말 그대로 객체를 생성하는데 사용되는 메서드입니다.

 

생성자를 정의를 하지 않으면 기본 생성자를 만들어 줍니다.

 

기본 생성자란 어떠한 인자도 받지 않는 생성자를 말합니다.

 

# 기본 생성자를 가진 클래스
class Unit:
    def __init__(self) -> None:
        pass

 

 

자바와 C++은 생성자 오버로딩(정의를 여러개 하는 것)을 지원하지만, 파이썬은 생성자 오버로딩을 지원하지 않습니다.

즉, 하나의 클래스에 하나의 생성자만을 만들 수 있죠.

 

그래서 값을 여러개 전달할 수 있도록 만들어 놓고, 기본 값을 주는 방법으로 이를 보완합니다.

 

class Unit:
    def __init__(self, name="marine", hp: int = 10, damage: int = 0) -> None:
        self.name = name
        self.hp = hp
        self.damage = damage

 

 

기본 값을 정의하지 않으면 TypeError를 발생시킵니다.

 

 

2) 인스턴스 변수

 

인스턴스 변수는 메서드에 정의한 변수이며, self와 함께 사용됩니다.

 

책의 예시를 통해서 만들어보죠.

 

지금까지 작성된 코드는 지상 유닛입니다.

그렇기 때문에 은폐가 불가능하죠. (스텔스 기능이 없습니다.)

 

그래서 우리는 스텔스 기능을 추가하고 싶습니다.

 

class Unit:
    def __init__(self, name="good", hp: int = 10, damage: int = 0) -> None:
        self.name = name
        self.hp = hp
        self.damage = damage
        print(f"{self.name} 유닛이 생성되었습니다.")
        print(f"체력 {self.hp}, 공격력 {self.damage}")


stealth = Unit("전투기", 80, 5)

stealth.cloacking = True

 

 

이렇게 cloaking 을 True로 바꾸면 은폐모드로 바꿀 수 있었으면 좋겠습니다.

 

 

하지만 이 코드를 입력하면 에러가 발생합니다.

cloaking 에 접근할 수 없다고 말하죠.

 

그럼 어떻게 해야할까요?

 

이럴 때 인스턴스 변수 선언이 필요합니다.

 

class Unit:
    def __init__(self, name: str, hp: int, damage: int) -> None:
        # 아래는 인스턴스 변수
        self.name = name
        self.hp = hp
        self.damage = damage
        self.cloaking = False
        print(f"{self.name} 유닛이 생성되었습니다.")
        print(f"체력 {self.hp}, 공격력 {self.damage}")


stealth = Unit("전투기", 80, 5)

stealth.cloaking = True

if stealth.cloaking == True:
    print(f"{stealth.name}는 현재 클로킹 상태입니다.")

 

이렇게 말이죠.

 

이 부분은 책에 없는 내용이니 어떻게 하면 인스턴스 변수를 선언해서 사용할 수 있는지를 중점적으로 봐주세요.

 

여기서 헷갈리실 것 같은 부분이, 매개변수와 인스턴스 변수의 개수입니다.

 

매개변수는 3개인데, 인스턴스 변수는 4개입니다.

 

 

네, 인스턴스 변수와 매개변수의 개수는 항상 같지 않습니다.

즉, 전달되는 값으로 초기화하고 싶은 경우에만 매개변수가 필요한 것이죠.

 

우리는 Unit이 생성될 때마다 이름과 공격력, 체력을 달리 하고 싶으니 매개변수를 사용해 이를 정의(초기화)했습니다.

 

하지만 은폐기능의 경우 기본으로 생성될 때 False로 두고 싶다면 이렇게 매개변수 없이 사용하면 됩니다.

 

 

 

위 코드에서 '이렇게 사용하면 된다.' 정도만 이해하고 넘어가시는 걸 추천드려요.

사실 이 코드는 뒤에서 배울 '상속'에서 더 자세히 다룰 예정입니다.

 

3) 메서드

메서드는 클래스 내부에 정의한 함수라고 말씀 드렸죠?

 

그럼 위에서 작성한 것으로 예시를 한번 만들어 볼게요.

 

class Unit:
    def __init__(self, name="good", hp: int = 10, damage: int = 0) -> None:
        self.name = name
        self.hp = hp
        self.damage = damage
        self.__initMessage()
    
    def __initMessage(self):
        print(f"{self.name} 유닛이 생성되었습니다.")
        print(f"체력 {self.hp}, 공격력 {self.damage}")



m = Unit("마린")

 

 

이렇게 __initMessage도 메서드입니다.

 

initMessage는 객체가 생성될 때 객체의 정보를 출력해주는 메서드죠.

 

책 273페이지의 attack역시 메서드입니다.

 

매개변수를 넘겨주고 이에 대한 공격 메시지를 출력해주는 메서드이죠.

 

꼭 책의 예시를 따라 치면서 익혀주세요!

 

 


이번 시간에는 9장 클래스와 객체의 생성까지 알아봤어요.

여기서 부터는 어려워지니 천천히 진도를 나가도록 할게요!

 

궁금한 점이 있다면 댓글 남겨주세요!

 

 

✅ 정리

* 게임 소개

    * 공통점 찾기

* 클래스와 객체의 생성

    * 메서드

    * 인스턴스 변수

    * 생성자

반응형