본문으로 건너뛰기
모던 C++LESSON 13

std::vector 기초: 동적 배열과 push_back, emplace_back

난이도초급 → 중급 입문
예상 시간45분
선수지식이전 강의

13강. std::vector 기초: 동적 배열과 push_back, emplace_back

이번 강의에서 해결할 문제​

플레이어가 얻을 아이템 수를 컴파일할 때 알 수 없다면 고정 배열만으로 관리하기 어렵습니다. 직접 동적 메모리를 늘리면 복사·해제·예외 상황까지 모두 처리해야 합니다.

학습 목표​

  • vector가 원소를 소유하는 동적 연속 컨테이너임을 설명합니다.
  • push_back과 emplace_back의 기본 차이를 사용합니다.
  • size, empty, at으로 목록 상태를 확인합니다.

먼저 알아야 할 핵심 개념​

std::vector<T>는 같은 타입의 원소를 연속 메모리에 보관하고 필요할 때 저장 공간을 늘립니다. push_back은 이미 만들어진 값을 추가하고 emplace_back은 전달한 인자로 원소를 컨테이너 안에서 생성합니다. 성능 차이를 추측하기보다 코드 의미와 측정 결과로 선택합니다.

가장 작은 실행 가능한 예제​

vector_inventory.cpp
#include <iostream>
#include <string>
#include <utility>
#include <vector>

struct Item {
std::string name;
int count;
};

int main() {
std::vector<Item> items;
items.reserve(3);

Item potion{"Potion", 2};
items.push_back(potion);
items.emplace_back(Item{"Key", 1});

std::cout << items.size() << ' ' << items.at(0).name << '\n';
}

핵심 코드 줄별 설명​

  1. 빈 vector<Item>이 아이템 객체를 소유합니다.
  2. reserve(3)은 예상 저장 공간을 준비하지만 원소 수는 늘리지 않습니다.
  3. push_back은 기존 potion 값을 목록에 복사합니다.
  4. 두 번째 원소는 전달된 임시 Item으로 추가됩니다.
  5. at(0)은 범위를 검사하며 첫 원소를 반환합니다.

실행 결과와 값 변화​

2 Potion

reserve 값을 10으로 바꿔도 size()는 2입니다. 용량과 실제 원소 수는 서로 다른 개념입니다.

단계별 실습​

실습 목표​

플레이어 인벤토리에 아이템을 추가하고 목록 상태를 확인합니다.

시작 전 상태와 실행 방법​

예제의 Item과 빈 vector를 C++17 프로젝트에 준비합니다.

1단계: 최소 코드 작성​

검, 방패, 포션을 push_back 또는 emplace_back으로 추가하고 모두 출력합니다.

2단계: 값 또는 조건을 바꿔 결과 비교​

reserve 전후에 capacity()를 출력해 저장 공간 변화를 비교합니다.

3단계: 작은 기능 확장​

목록이 비어 있으면 empty inventory를 출력하는 분기를 추가합니다.

4단계: 스스로 해결하기​

사용자 입력 인덱스를 at으로 조회하고 범위를 벗어났을 때 프로그램이 어떻게 알리는지 확인하세요.

막혔을 때​

at이 예외를 던졌다면 인덱스가 size()보다 작은지 확인합니다. reserve 뒤 items[0]을 사용할 수는 없습니다. 원소는 push_back 등으로 실제 생성해야 합니다.

흔한 실수와 해결 방법​

  • capacity를 size로 오해: 예약 공간에는 아직 원소가 없습니다.
  • 범위 밖 operator[] 접근: 외부 입력은 먼저 검사하거나 at을 사용합니다.
  • emplace를 무조건 빠르다고 선택: 전달 형태가 복잡해지면 명확한 객체 생성과 push_back이 더 읽기 좋을 수 있습니다.

게임 개발 연결​

인벤토리, 적 목록, 투사체 목록처럼 원소 수가 실행 중 변하는 데이터에 적합합니다. Unreal의 TArray도 연속 컨테이너이지만 함수 이름과 재할당 규칙 세부가 다르므로 엔진 문서를 확인합니다.

이해 점검 질문 3개​

  1. size와 capacity는 각각 무엇을 뜻하나요?
  2. push_back과 emplace_back의 입력 의미는 어떻게 다른가요?
  3. 외부에서 받은 인덱스에 at이 유용한 이유는 무엇인가요?

핵심 요약​

vector는 크기가 변하는 같은 타입의 원소를 소유합니다. 용량과 원소 수를 구분하고, 추가 방식은 명확성과 실제 생성 흐름을 기준으로 선택합니다.

다음 강의 연결​

14강. STL 알고리즘 기초에서 vector 원소의 찾기·정렬·조건 계산을 목적 이름으로 표현합니다.

MINI QUIZ

std::vector 기초: 동적 배열과 push_back, emplace_back 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“std::vector 기초: 동적 배열과 push_back, emplace_back”에서 다음 단계로 넘어가기 전에 확인할 핵심은 무엇인가요?
  2. 문제 2“std::vector 기초: 동적 배열과 push_back, emplace_back”에서 ‘capacity를 size로 오해’ 문제가 생겼습니다. 가장 알맞은 진단 또는 대응은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

13강. std::vector 기초: 동적 배열과 push_back, emplace_back 미완료 상태