std::vector 기초: 동적 배열과 push_back, emplace_back
13강. std::vector 기초: 동적 배열과 push_back, emplace_back
이번 강의에서 해결할 문제
플레이어가 얻을 아이템 수를 컴파일할 때 알 수 없다면 고정 배열만으로 관리하기 어렵습니다. 직접 동적 메모리를 늘리면 복사·해제·예외 상황까지 모두 처리해야 합니다.
학습 목표
vector가 원소를 소유하는 동적 연속 컨테이너임을 설명합니다.push_back과emplace_back의 기본 차이를 사용합니다.size,empty,at으로 목록 상태를 확인합니다.
먼저 알아야 할 핵심 개념
std::vector<T>는 같은 타입의 원소를 연속 메모리에 보관하고 필요할 때 저장 공간을 늘립니다. push_back은 이미 만들어진 값을 추가하고 emplace_back은 전달한 인자로 원소를 컨테이너 안에서 생성합니다. 성능 차이를 추측하기보다 코드 의미와 측정 결과로 선택합니다.
가장 작은 실행 가능한 예제
#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';
}
핵심 코드 줄별 설명
- 빈
vector<Item>이 아이템 객체를 소유합니다. reserve(3)은 예상 저장 공간을 준비하지만 원소 수는 늘리지 않습니다.push_back은 기존potion값을 목록에 복사합니다.- 두 번째 원소는 전달된 임시
Item으로 추가됩니다. 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개
size와capacity는 각각 무엇을 뜻하나요?push_back과emplace_back의 입력 의미는 어떻게 다른가요?- 외부에서 받은 인덱스에
at이 유용한 이유는 무엇인가요?
핵심 요약
vector는 크기가 변하는 같은 타입의 원소를 소유합니다. 용량과 원소 수를 구분하고, 추가 방식은 명확성과 실제 생성 흐름을 기준으로 선택합니다.
다음 강의 연결
14강. STL 알고리즘 기초에서 vector 원소의 찾기·정렬·조건 계산을 목적 이름으로 표현합니다.
std::vector 기초: 동적 배열과 push_back, emplace_back 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.