1. 코드 및 주요 개념 분석
Inventory 클래스 생성 목적
- 왜 필요한가?
- 아이템 관리 문제를 해결하기 위함:
- 동적으로 생성된 아이템의 소유권 및 메모리 관리를 단순화합니다.
- 인벤토리를 통해 모든 아이템을 중앙에서 관리하고, 필요할 때 쉽게 생성/제거할 수 있습니다.
- 인벤토리가 없으면 모든 아이템 객체를 수동으로 추적하고 메모리를 해제해야 하므로 복잡성이 증가합니다.
- 코드 유지보수성 향상:
- 인벤토리 시스템을 별도로 두어, 아이템 관련 작업을 단일 책임으로 캡슐화합니다.
1.1 Inventory.h 헤더 파일
#pragma once
#include "Item.h"
enum {
MAX_SLOT = 100
};
class Inventory
{
public:
Inventory();
~Inventory();
bool AddItem(Item* item);
bool RemoveItem(Item* item);
Item* GetItemAtSlot(int slot);
void Clear();
static Inventory* GetInstance();
private:
int FindEmptySlot();
int FindItemSlot(Item* item);
private:
Item* _items[MAX_SLOT];
int _itemCount = 0;
static Inventory* s_instance;
};
1.2 Inventory.cpp 소스 파일
#include "Inventory.h"
Inventory* Inventory::s_instance = nullptr;
Inventory::Inventory()
{
for (int i = 0; i < MAX_SLOT; ++i)
_items[i] = nullptr;
}
Inventory::~Inventory()
{
Clear();
}
bool Inventory::AddItem(Item* item)
{
if (item == nullptr) return false;
int emptySlot = FindEmptySlot();
if (emptySlot < 0) return false;
_items[emptySlot] = item;
_itemCount++;
return true;
}
bool Inventory::RemoveItem(Item* item)
{
if (item == nullptr) return false;
int slot = FindItemSlot(item);
if (slot < 0) return false;
delete _items[slot];
_items[slot] = nullptr;
_itemCount--;
return true;
}
Item* Inventory::GetItemAtSlot(int slot)
{
if (slot < 0 || slot >= MAX_SLOT) return nullptr;
return _items[slot];
}
void Inventory::Clear()
{
for (int i = 0; i < MAX_SLOT; ++i)
{
if (_items[i])
{
delete _items[i];
_items[i] = nullptr;
}
}
_itemCount = 0;
}
int Inventory::FindEmptySlot()
{
for (int i = 0; i < MAX_SLOT; ++i)
{
if (_items[i] == nullptr) return i;
}
return -1;
}
int Inventory::FindItemSlot(Item* item)
{
for (int i = 0; i < MAX_SLOT; ++i)
{
if (_items[i] == item) return i;
}
return -1;
}
Inventory* Inventory::GetInstance()
{
if (s_instance == nullptr)
{
s_instance = new Inventory();
}
return s_instance;
}
1.3 Item.h
#pragma once
enum ItemRarity
{
IR_None,
IR_Normal,
IR_Rare,
IR_Unique,
};
enum ItemType
{
IT_None,
IT_Weapon,
IT_Armor,
};
class Item
{
protected:
Item(ItemType itemType);
public:
virtual ~Item();
virtual void PrintInfo() = 0;
ItemType GetItemType() { return _itemType; }
protected:
int _itemId = 0;
int _itemCount = 0;
ItemRarity _rarity = IR_Normal;
ItemType _itemType = IT_None;
};
1.4 main.cpp
#include <iostream>
#include "Inventory.h"
#include "Item.h"
Item* DropItem()
{
if (rand() % 2 == 0)
{
Weapon* weapon = new Weapon();
return weapon;
}
else
{
Armor* armor = new Armor();
return armor;
}
}
int main()
{
srand((unsigned)time(0));
for (int i = 0; i < 100; ++i)
{
Item* item = DropItem();
item->PrintInfo();
if (Inventory::GetInstance()->AddItem(item))
{
std::cout << "Added item to Inventory" << std::endl;
}
else
{
std::cout << "Failed to add item to Inventory" << std::endl;
delete item;
}
}
for (int i = 0; i < 20; ++i)
{
int randIndex = rand() % MAX_SLOT;
Item* item = Inventory::GetInstance()->GetItemAtSlot(randIndex);
if (item && Inventory::GetInstance()->RemoveItem(item))
{
std::cout << "Removed Item" << std::endl;
}
}
Inventory::GetInstance()->Clear();
delete Inventory::GetInstance();
return 0;
}