본문 바로가기
BackEnd/c++

배열, vector 실습 - 모험가의 데이터 매니저

by 마운틴케이 2026. 3. 21.

오늘의 gemini 미션은 배열과 vector를 실습해보는 예제이다.

 

 

🎮 주말 집중 실습: "모험가의 데이터 매니저"

이 미션은 약 5시간 분량으로 구성되어 있으며, 단순 타이핑을 넘어 메모리 구조데이터 관리의 원리를 이해하는 데 목적이 있습니다.

[1부] 기초 설계 및 변수 정의 (1시간)

  • 목표: 캐릭터의 고정 데이터와 가변 데이터를 구분하여 선언합니다.
  • 과제: * const를 사용하여 캐릭터의 MAX_HP와 MAX_LEVEL을 상수로 선언하세요.
    • 플레이어 이름(string), 현재 체력(float), 경험치(double) 변수를 만드세요.
    • 핵심 체크: 왜 체력은 int가 아닌 float을 쓸까요? (데미지 계산 시 소수점 처리를 고민해 보세요.)

[2부] 고정형 배열 vs 동적 벡터 (1.5시간)

  • 목표: 상황에 맞는 자료구조 선택 능력을 기릅니다.
  • 과제:
    • int equipment[3] 배열을 만들어 장착 중인 아이템 번호 3개를 저장하세요. (고정된 슬롯 개념)
    • std::vector<string> inventory를 선언하고 push_back을 이용해 아이템 3개를 추가하세요. (늘어나는 가방 개념)
    • 인벤토리의 2번째 아이템 이름을 수정해 보고, 전체 목록을 출력하세요.

[3부] 다차원 배열로 만드는 미니 맵 (1.5시간)

  • 목표: 게임 월드의 좌표 개념을 익힙니다.
  • 과제:
    • char game_map[5][5] 2차원 배열을 만드세요.
    • 모든 칸을 '.'으로 초기화한 뒤, game_map[2][2] = 'P'(플레이어)를 배치하세요.
    • 중첩 for문을 사용하여 5x5 지도를 콘솔창에 출력하세요.

[4부] 디버깅 및 코드 최적화 (1시간)

  • 목표: 작성한 코드의 안정성을 검토합니다.
  • 과제:
    • inventory.at(i)를 사용하여 인덱스 범위를 벗어났을 때 발생하는 에러를 확인하고 예외 처리를 고민해 보세요.
    • 전체 코드를 다시 보며 중복되는 부분을 함수로 뺄 수 있을지 구상해 봅니다. (함수는 다음 주 주제입니다!)

 

 


그리고 작성한 코드. 

#include <iostream>
#include <vector>

using namespace std;

// "모험가의 데이터 매니저"

int main() {

	// 1. 기초 설계 및 변수 정의
	// 캐릭터의 고정 데이터와 가변 데이터를 구분하여 선언합니다.

	const float MAX_HP = 100.0f;
	const int MAX_LEVEL = 100;

	string player_name;

	cout << "플레이어 이름을 입력하세요." << endl;
	cin >> player_name;

	float current_hp = MAX_HP;
	double experience_points = 0.0;

	cout << "캐릭터 이름: " << player_name << endl;
	cout << "hp: " << current_hp << endl;
	cout << "exp: " << experience_points << endl;
	cout << "==============================" << endl;

	// 2. 고정형 배열 vs 동적 벡터
	// 상황에 맞는 자료구조를 선택합니다.

	int equipment[]{ 123, 456, 789 };

	vector <string> inventory;

	inventory.push_back("나뭇가지");
	inventory.push_back("상처약");
	inventory.push_back("잃어버린 물건");

	inventory.at(1) = "좋은 상처약";

	cout << "인벤토리\n { " << endl;
	cout << " - " << inventory.at(0) << endl;
	cout << " - " << inventory.at(1) << endl;
	cout << " - " << inventory.at(2) << endl;
	cout << "}" << endl;
	cout << "==============================" << endl;

	// 3. 다차원 배열로 만드는 미니 맵
	// 게임 월드의 좌표 개념을 익힙니다.

	char game_map[5][5]{ 
		{'.','.','.','.','.'},
		{'.','.','.','.','.'},
		{'.','.','.','.','.'},
		{'.','.','.','.','.'},
		{'.','.','.','.','.'}
	};

	game_map[2][2] = 'P';

	for (int i = 0; i < 5; i++) {
		for (int j = 0; j < 5; j++) {
			cout << game_map[i][j] << ' ';
		}
		cout << endl;
	}
	cout << "==============================" << endl;


	return 0;
}

 

 

 

📝 주말 과제 

1. 배열(Array)과 벡터(Vector)의 가장 큰 차이점은 무엇이며, 어떤 상황에서 배열을 쓰는 것이 유리한가요?

 

가장 큰 차이점은 배열은 선언 시에 고정된 크기를 가지기 때문에 크기가 늘어나거나 줄어들 수 없다는 점이고

벡터는 가변 크기를 갖기 때문에 런타임 시에 코드 동작에 따라 크기가 동적으로 늘어날 수 있다는 점이다.

그리고 벡터는 c++ 표준 템플릿 라이브러리에 속한 object로, 크기 출력, 정렬, 검색, 삭제, 추가 등의 함수를 포함하고 있다.

일반적으로 사용하기에는 벡터가 편리하지만, 만약 예제의 내용처럼 장비 아이템과 같이 크기가 고정되어 요소가 추가되거나 삭제되면 안되는 성격을 가진 데이터라면 배열을 쓰는 것이 더 나을 것이다.

그리고 배열이 벡터보다 메모리 오버헤드가 적고 접근 속도가 미세하게 더 빠르다.

벡터는 크기를 늘릴 때 내부적으로 메모리를 재할당하는 과정이 있지만 배열은 그럴 일이 없기 때문이다.

 

2. const 키워드를 사용했을 때 얻을 수 있는 이점(안정성 측면)은 무엇인가요?

 

const 키워드를 사용해 변수를 선언하면 그건 상수가 된다.

상수는 한번 정의하면 값을 바꿀 수 없다. (불변성(Immutability) 보장)

어떤 기본이 되는 값이나 한번 정의해두고 계속 사용해야하는 값을 정의할 때 사용한다.

값을 변경하려하면 컴파일 에러가 발생하기 때문에 실수로 값을 변경하는 일을 방지할 수 있다.

 

3. 실습 중 가장 많이 발생한 에러는 무엇이었나요? (예: 세미콜론 누락, 인덱스 초과 등)

 

실습 중 에러가 발생하진 않았지만 배열이나 벡터와 같이 연속적으로 저장되어 크기를 갖는 데이터의 경우

각 요소에 접근할 때 주의가 필요하다.

실제 크기보다 더 큰 인덱스에 접근하려 하면 Index out of bounds 예외가 발생한다.

만약 사용자로부터 입력받은 값에 따라 해당 요소에 접근하는 코드가 있다면,

입력받은 값을 검증하는 방어 코드가 필요할 것이다.


댓글 피드백은 언제나 환영합니다!