목표
객체 지향 설계방식과 SOLID원칙을 기반으로 하여.
C++ CLI환경에서 간단한 게임 시스템을 구현해보기.
그중에서도 아이템과 제작 시스템을 구현해보는것.
SOLID 원칙이란?
- Single responsibity principle, 단일 책임 원칙.
하나의 클래스는 하나의 책임만을 가져야 한다. - Open/closed principle, 개방 폐쇄 원칙
소프트웨어 요소는 확장에는 열려있으나 변경에는 닫혀 있어야 한다.
- 확장에 열려있다 = 요구사항에 따라 모듈의 동작을 추가(확장)할 수 있어야 한다.
- 수정에 닫혀있다 = 소스코드의 변경 없이 모듈의 기능을 수정할 수 있어야 한다.(추상화와 구현부의 분리 등)
- Liskov substitution principle : 리스코프 치환 원칙
상위 클래스를 자식 클래스로 대체하여도 프로그램의 정확성을 깨뜨리지 않아야 한다- A클래스를 이용하는 기능이 A를 상속받은 자식 B클래스로 치환하여도 정상 작동해야한다.
- Interface segregation principle, 인터페이스 분리 원칙
인터페이스를 작은 단위로 분리하여 필요한 기능만을 구현 및 사용하도록 해야 한다. - Dependency inversion principle, 의존관계 역전 원칙
고차원 모듈은 저차원 모듈에 의존하면 안 된다. 이 두 모듈 모두 다른 추상화된 것에 의존해야 한다
예시로 컴퓨터가 화면을 출력할때 브랜드별모니터에 의존하는것이 아닌 "출력 장치"라는 인터페이스를 통해 출력.
구현해보려는것의 예시는 게임 테라리아의 제작 시스템을 참고하였음

위 이미지처럼 기능을 구현하기위해 필요한것들을 최소한으로 생각해보면
아이템과 인벤토리, 제작시스템과 조합 레시피 정도로 구성해 볼 수 있을것같다.
우선 구현 전 필요한 클래스들에 대한 대략적인 클래스를 구성해보았다.
SOLID원칙의 단일 책임 원칙을 생각하며 최대한 각자의 책임을 분리하려고 시도하였다.
- 재료와 완성품등 아이템을 담는 객체 클래스 : Item
아이템의 ID, 이름, 설명을 포함한다. - 아이템을 정의하는 데이터베이스 : ItemDatabase
아이템의 이름, 설명 등의 실제 데이터가 저장될 클래스(DB를 대체) - 아이템을 저장하는 인벤토리 : Inventory
아이템을 담는 배열을 포함하여 이를 관리하는 클래스 - 제작방법을 정의하는 레시피클래스 : CraftRecipe
재료 아이템과 결과 아이템의 구성을 정의하는 CraftRecipe클래스 - 제작을 구현하는 제작 시스템 : CraftingManager
inventory와 Item, 그리고 CraftRecipe를 참조하여 조합식에 맞는 아이템을 받아 결과물을 반환하는 기능을 구현할 클래스

우선 구성해본 클래스의 내용물을 visual studio 기능으로 클래스들을 시각화해보았다.
Inventory는 map<int, int> stock에 아이템들을 저장한다.
map의 key는 아이템의 ID, value는 개수를 의미한다.
Item객체는 int형 id와 string형 name, description을 저장한다.
ItemDatabase는 std::map<int, Item> 형태의 ItemDatabase 배열을 가진다. 초기화시 모든 아이템에 대한 정의가 여기 저장된다.
id를통한 아이템 조회등은 이 클래스가 담당한다.
아이템을 다룰때 기본적으로 id만을 이용해 다루고, 정보에 대해 알아보아야 할 때는 ItemDatabase를 이용하도록 하여 책임을 분리하였다.
CraftRecipe는 재작 재료인 Ingredients를 map<int, int> 형태로 정의하여 제작에 어떤 아이템이 몇개 필요한지를 배열로 저장하도록 구상하였고, 제작결과를 int형 resultItemId 로 가진다.
CraftingManager은 ItemDatabase처럼 초기화시 제작식에 대한 정보를 recipe객체로 가지고있으며,
사용자가 인벤토리를 통해 제작시스템에 접근하도록 할 생각이다.
다음은 각 클래스들의 기능을 정의해볼것.
'개발 > 내일배움캠프' 카테고리의 다른 글
| C++ 인벤토리, 제작시스템 구현해보기 3 (0) | 2026.03.16 |
|---|---|
| C++ 인벤토리, 제작시스템 구현해보기 2 (0) | 2026.03.13 |
| 자주 볼거같은 Character Movement컴포넌트 속성들 기록 (0) | 2026.02.27 |
| C언어 conversion specification(서식or형식 지정자) (0) | 2026.02.25 |
| 언리얼 구식 입력 시스템(UE4이전의 방식) (0) | 2026.02.24 |