목록으로

프로그래밍 · Python

Python 입문 시리즈 #15: 클래스로 현실 세계를 코드로 설계하기

BeanCon
Python 입문자가 Class와 Object로 RPG 캐릭터 시스템을 설계하는 과정을 표현한 대표 이미지

Python 입문 시리즈 15편입니다. RPG 캐릭터 시스템 예제로 클래스가 필요한 이유, 클래스와 객체의 차이, __init__과 self, 객체 생성, 메서드, 실무 서비스의 클래스 구조, AI 개발에서 만나는 객체, 초보자가 자주 하는 실수, 객체지향 프로그래밍의 의미를 정리했습니다.

1. RPG 캐릭터 시스템 문제

여러분이 게임 개발 스튜디오에 입사한 신입 개발자라고 가정해보겠습니다. 첫 번째 업무는 캐릭터 시스템을 만드는 것입니다.

필요한 캐릭터
  • 전사
  • 마법사
  • 궁수
  • 힐러
각 캐릭터가 가져야 할 정보
  • 이름
  • 레벨
  • 체력
  • 공격력

지금까지 배운 방식으로 전사 캐릭터를 만들면 다음처럼 작성할 수 있습니다.

warrior_name = "전사"
warrior_level = 10
warrior_hp = 100
warrior_attack = 20

마법사를 추가합니다.

wizard_name = "마법사"
wizard_level = 12
wizard_hp = 70
wizard_attack = 35

궁수도 추가합니다.

archer_name = "궁수"
archer_level = 8
archer_hp = 80
archer_attack = 25
문제 상황

캐릭터가 몇 명일 때는 버틸 수 있지만 10,000명이 되면 변수만으로는 관리가 거의 불가능해집니다.

2. 클래스가 등장한 이유

지금까지 우리는 변수, List, Dictionary를 배웠습니다. 하지만 현실 세계의 데이터는 서로 관계가 있습니다.

대상하나로 묶이는 정보
전사이름, 레벨, 체력, 공격력
자동차제조사, 모델명, 색상, 가격

Python은 이런 현실 세계를 코드로 표현하기 위해 클래스 Class를 제공합니다.

클래스는 설계도다

건물을 짓기 전에는 설계도가 필요하고, 자동차를 생산하기 전에도 설계도가 필요합니다. 게임 캐릭터를 만들기 전에도 캐릭터 설계도가 필요합니다.

Class의 의미

Python에서 클래스는 객체를 만들기 위한 설계도입니다. 같은 설계도로 여러 캐릭터, 여러 사용자, 여러 상품을 만들 수 있습니다.

3. 클래스 기본 구조

가장 단순한 캐릭터 설계도입니다.

class Character:
    pass

이것만으로는 아직 아무 기능도 없습니다. 빈 설계도일 뿐입니다.

캐릭터 정보 추가하기

class Character:

    def __init__(
        self,
        name,
        level,
        hp
    ):
        self.name = name
        self.level = level
        self.hp = hp

처음 보면 어렵지만, __init__은 캐릭터 생성 설명서라고 생각하면 쉽습니다.

요소의미
class CharacterCharacter라는 설계도를 만듭니다.
__init__객체가 생성될 때 처음 실행되는 초기화 함수입니다.
self현재 만들어지는 객체 자신을 가리킵니다.
self.name객체 안에 name 값을 저장합니다.

캐릭터 생성하기

설계도를 만들었으니 실제 캐릭터를 생성합니다.

warrior = Character(
    "전사",
    10,
    100
)

이름을 출력합니다.

print(warrior.name)

결과입니다.

전사

레벨을 출력합니다.

print(warrior.level)

결과입니다.

10

설계도 하나로 수천 개 생성

warrior = Character(
    "전사",
    10,
    100
)

wizard = Character(
    "마법사",
    12,
    70
)

archer = Character(
    "궁수",
    8,
    80
)
클래스의 핵심

설계도는 하나이고, 실제 캐릭터는 여러 개 만들 수 있습니다. 이것이 클래스의 핵심입니다.

4. 객체 Object 이해하기

초보자가 가장 헷갈리는 용어가 Class와 Object입니다.

용어비유예시
Class설계도자동차 설계도, Character 설계도
Object실제 제품실제 자동차, warrior 캐릭터

Python 예시입니다.

class Car:
    pass
tesla = Car()
bmw = Car()

여기서 tesla와 bmw가 바로 객체 Object입니다.

5. 메서드로 행동 만들기

지금까지 캐릭터는 이름과 값만 가지고 있었습니다. 하지만 캐릭터는 행동도 할 수 있어야 합니다.

class Character:

    def __init__(
        self,
        name,
        attack
    ):
        self.name = name
        self.attack = attack

    def attack_enemy(self):
        print(
            self.name +
            " 공격!"
        )

캐릭터를 생성합니다.

warrior = Character(
    "전사",
    20
)

공격 행동을 실행합니다.

warrior.attack_enemy()

결과입니다.

전사 공격!
메서드의 의미

클래스 안에 정의된 함수는 메서드 Method라고 부릅니다. 객체가 할 수 있는 행동을 표현합니다.

6. 실무 프로젝트의 클래스

여러분이 사용하는 거의 모든 서비스는 클래스로 표현할 수 있습니다.

서비스대표 클래스
카카오톡User, ChatRoom, Message
쇼핑몰Product, Order, Customer
은행Account, Transaction, Card
게임Player, Monster, Item

현실 세계의 모든 것을 코드로 표현하는 방법이 객체지향 프로그래밍입니다.

회원, 상품, 주문 예시

class User:

    def __init__(
        self,
        name,
        email
    ):
        self.name = name
        self.email = email
class Product:

    def __init__(
        self,
        name,
        price
    ):
        self.name = name
        self.price = price
class Order:

    def __init__(
        self,
        user,
        product
    ):
        self.user = user
        self.product = product

실제 서비스들은 수백 개 이상의 클래스가 협력하여 동작합니다.

7. AI 개발에서 만나는 객체

AI 개발에서도 클래스와 객체는 계속 등장합니다. 머신러닝 라이브러리에서 사용하는 model도 객체입니다.

라이브러리자주 보는 코드의미
Scikit-Learnmodel.fit()모델 객체가 학습합니다.
TensorFlowmodel.predict()모델 객체가 예측합니다.
PyTorchmodel.train()모델 객체가 학습 모드로 전환됩니다.
model.fit()
model.predict()
model.train()
AI와 클래스

AI 개발자도 결국 클래스와 함께 살아갑니다. 모델, 데이터셋, 레이어, 옵티마이저 대부분이 객체로 다뤄집니다.

8. 초보자가 자주 하는 실수

실수 1: self를 빼먹는다

잘못된 코드입니다.

def attack():

올바른 코드입니다.

def attack(self):

객체 안의 메서드는 현재 객체 자신을 받기 위해 self를 첫 번째 매개변수로 둡니다.

실수 2: 클래스와 객체를 구분하지 못한다

Character는 설계도입니다.

Character

warrior는 실제 캐릭터입니다.

warrior
구분의미
Character캐릭터를 만들기 위한 클래스
warriorCharacter 클래스로 만든 객체

9. 개발자의 성장과 클래스

게임 개발자 관점에서 성장 과정을 보면 클래스가 왜 필요한지 더 분명해집니다.

1일 차

name = "전사"처럼 변수 하나로 캐릭터를 표현합니다.

7일 차

player = {"name":"전사"}처럼 Dictionary로 데이터를 묶습니다.

30일 차

class Player:로 플레이어 설계도를 만들기 시작합니다.

6개월 차

Monster, Item, Inventory, Skill 같은 여러 클래스가 협력해 하나의 게임을 만듭니다.

name = "전사"
player = {
    "name":"전사"
}
class Player:
class Monster:
class Item:
class Inventory:
class Skill:

클래스는 프로그래밍 세계의 레고 블록이다

레고 벽돌 하나만 가지고는 아무것도 만들 수 없습니다. 하지만 벽돌을 조합하면 집도 만들고 자동차도 만들고 우주선도 만들 수 있습니다.

클래스도 마찬가지입니다. 작은 클래스들이 모여 웹사이트가 되고, 게임이 되고, AI가 되고, 운영체제가 됩니다.

10. 정리와 다음 편 예고

오늘 배운 내용을 한 문장으로 정리하면 함수 Function이 행동을 재사용하는 기술이라면, 클래스 Class는 현실 세계를 코드로 설계하는 기술입니다.

핵심 정리
  • 클래스는 객체를 만들기 위한 설계도입니다.
  • 객체는 클래스로 만들어진 실제 결과물입니다.
  • __init__은 객체가 생성될 때 실행되는 초기화 함수입니다.
  • self는 현재 객체 자신을 가리킵니다.
  • 메서드는 객체가 수행할 수 있는 행동입니다.
  • 실무 서비스는 수많은 클래스가 협력해 동작합니다.
  • AI 개발에서도 모델과 데이터셋은 객체로 자주 다뤄집니다.
개발 관점

지금까지는 Python 문법을 배웠다면, 클래스부터는 어떻게 프로그램을 설계할 것인가를 배우게 됩니다. 이 지점부터 코더와 소프트웨어 엔지니어의 차이가 만들어집니다.

Python 입문 연재 16 예고
  • 상속 Inheritance 이해하기
  • 전사, 마법사, 궁수가 하나의 부모 클래스를 공유하는 방법
  • 객체지향 프로그래밍의 진짜 재미가 시작되는 구간

댓글

0

댓글을 불러오는 중입니다.