목차
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를 제공합니다.
클래스는 설계도다
건물을 짓기 전에는 설계도가 필요하고, 자동차를 생산하기 전에도 설계도가 필요합니다. 게임 캐릭터를 만들기 전에도 캐릭터 설계도가 필요합니다.
Python에서 클래스는 객체를 만들기 위한 설계도입니다. 같은 설계도로 여러 캐릭터, 여러 사용자, 여러 상품을 만들 수 있습니다.
3. 클래스 기본 구조
가장 단순한 캐릭터 설계도입니다.
class Character:
pass이것만으로는 아직 아무 기능도 없습니다. 빈 설계도일 뿐입니다.
캐릭터 정보 추가하기
class Character:
def __init__(
self,
name,
level,
hp
):
self.name = name
self.level = level
self.hp = hp처음 보면 어렵지만, __init__은 캐릭터 생성 설명서라고 생각하면 쉽습니다.
| 요소 | 의미 |
|---|---|
| class Character | Character라는 설계도를 만듭니다. |
| __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:
passtesla = 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 = emailclass Product:
def __init__(
self,
name,
price
):
self.name = name
self.price = priceclass Order:
def __init__(
self,
user,
product
):
self.user = user
self.product = product실제 서비스들은 수백 개 이상의 클래스가 협력하여 동작합니다.
7. AI 개발에서 만나는 객체
AI 개발에서도 클래스와 객체는 계속 등장합니다. 머신러닝 라이브러리에서 사용하는 model도 객체입니다.
| 라이브러리 | 자주 보는 코드 | 의미 |
|---|---|---|
| Scikit-Learn | model.fit() | 모델 객체가 학습합니다. |
| TensorFlow | model.predict() | 모델 객체가 예측합니다. |
| PyTorch | model.train() | 모델 객체가 학습 모드로 전환됩니다. |
model.fit()model.predict()model.train()AI 개발자도 결국 클래스와 함께 살아갑니다. 모델, 데이터셋, 레이어, 옵티마이저 대부분이 객체로 다뤄집니다.
8. 초보자가 자주 하는 실수
실수 1: self를 빼먹는다
잘못된 코드입니다.
def attack():올바른 코드입니다.
def attack(self):객체 안의 메서드는 현재 객체 자신을 받기 위해 self를 첫 번째 매개변수로 둡니다.
실수 2: 클래스와 객체를 구분하지 못한다
Character는 설계도입니다.
Characterwarrior는 실제 캐릭터입니다.
warrior| 구분 | 의미 |
|---|---|
| Character | 캐릭터를 만들기 위한 클래스 |
| warrior | Character 클래스로 만든 객체 |
9. 개발자의 성장과 클래스
게임 개발자 관점에서 성장 과정을 보면 클래스가 왜 필요한지 더 분명해집니다.
name = "전사"처럼 변수 하나로 캐릭터를 표현합니다.
player = {"name":"전사"}처럼 Dictionary로 데이터를 묶습니다.
class Player:로 플레이어 설계도를 만들기 시작합니다.
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 문법을 배웠다면, 클래스부터는 어떻게 프로그램을 설계할 것인가를 배우게 됩니다. 이 지점부터 코더와 소프트웨어 엔지니어의 차이가 만들어집니다.
- 상속 Inheritance 이해하기
- 전사, 마법사, 궁수가 하나의 부모 클래스를 공유하는 방법
- 객체지향 프로그래밍의 진짜 재미가 시작되는 구간
