[TIL] C++ Text RPG 객체지향 구조 개선

최석훈·2026년 5월 12일

26.05.12

1. Player 클래스를 기반으로 직업 클래스 분리

기존에는 main.cpp 안에서 모든 스탯과 직업 로직을 직접 관리했다.

하지만 코드가 길어지고 직업별 기능이 늘어나면서:

  • 유지보수 어려움
  • 기능 추가 불편
  • 중복 코드 증가

문제가 생기기 시작했다.

그래서 Player 클래스를 부모 클래스로 만들고
직업별 클래스를 상속받도록 구조를 변경했다.

class Player
{
protected:
string _name;
string _job;
int _hp;
int _mp;
int _atk;
int _def;
int _level;

public:
virtual void attack() = 0;
virtual ~Player() {}
};


class Warrior : public Player
{
public:
Warrior(string name,
int hp,
int mp,
int atk,
int def);

void attack() override;

};


2. 순수 가상 함수(Pure Virtual Function)

virtual void attack() = 0;

"모든 직업은 반드시 attack()을 구현해야 한다"

이렇게 하면 Player는 추상 클래스(Abstract Class)가 된다.

Player player;
처럼 직접 생성은 불가능하다.


3. override 사용

void attack() override;
override는 부모 virtual 함수 재정의 여부를 검사

오타나 함수명 실수를 방지할 수 있다.


4. 다형성(Polymorphism)

직업 선택 후 Player* player = nullptr; 를 선언하고, player = new Warrior(...); 형태로 동적 할당을 사용했다.

부모 포인터 하나로 모든 객체를 관리할 수 있다.


5. 동적 할당과 delete

new로 생성한 객체는 직접 메모리 해제를 해야 한다.

delete player;
player = nullptr;

delete를 하지 않으면 메모리 누수(memory leak) 가 발생할 수 있다. 또한 삭제 후 player = nullptr; 를 통해 dangling pointer를 방지할 수 있다.

배운점

부모 클래스는 공통 데이터와 기능 관리
자식 클래스는 직업별 특징 구현

  • 생성자 초기화 리스트에서는 멤버 변수(_hp) 가 아니라 매개변수(hp) 를 사용해야 한다.

잘못 사용할 시

  • 초기화되지 않은 값 사용
  • 메모리 오류
  • std::length_error 예외
profile
반갑습니다.

0개의 댓글