C++ vector 사용법 완벽 가이드: 동적 배열, push_back, size(), at()까지 한눈에!
🚀 C++ 초보자도 쉽게 배우는 vector STL 컨테이너 사용법 총정리!
C++을 배우다 보면 자료 구조를 어떻게 효율적으로 다룰 수 있을지가 가장 큰 고민 중 하나인데요.
특히 동적으로 크기를 조절할 수 있는 배열이 필요할 때 vector는 정말 유용한 도구가 됩니다.
하지만 처음 접하면 멤버 함수도 많고, 메모리 처리 방식도 생소해서 어렵게 느껴질 수 있어요.
그래서 오늘은 vector의 기본 개념부터 자주 쓰이는 함수들까지 한 번에 이해할 수 있도록 정리해보았습니다.
C++을 막 시작한 분들에게 꼭 도움이 되었으면 좋겠어요.
이 글에서는 C++ vector의 특징, 사용법, 자주 쓰이는 함수들, 메모리 관리 방식 등을 다루며, 단순 문법 암기가 아닌 실제 코드 예시를 통해 개념을 확실히 잡을 수 있도록 설명할 예정입니다.
또한, vector와 배열의 차이점, 성능상 이점도 함께 알아보며 실무에서의 활용 팁도 소개할게요.
한 번만 제대로 읽어두면 C++ 자료구조 공부가 훨씬 수월해질 거예요!
📋 목차
🔗 vector란 무엇인가요?
C++의 vector는 STL(Standard Template Library)에서 제공하는 대표적인 동적 배열 컨테이너입니다.
일반적인 배열(array)과 비슷한 역할을 하지만, 크기를 동적으로 조절할 수 있고 메모리 관리도 자동으로 처리해주는 점에서 더 유연하고 강력한 기능을 갖고 있습니다.
배열은 처음 선언할 때 크기를 고정해야 하며, 이후 데이터를 추가하거나 삭제하려면 복잡한 처리가 필요합니다.
하지만 vector는 push_back() 함수 하나만으로도 손쉽게 요소를 추가할 수 있으며, 자동으로 필요한 만큼 메모리를 재할당해줍니다.
이러한 특징 덕분에 실무에서는 배열보다 vector를 훨씬 더 많이 사용하게 되죠.
또한, vector는 내부적으로 포인터 기반으로 작동하지만 배열처럼 인덱스를 통한 접근이 가능합니다.
즉, 복잡한 포인터 연산 없이도 원하는 데이터를 빠르게 읽고 쓸 수 있습니다.
💡 TIP: vector는 템플릿 클래스이기 때문에 int, double, string, 사용자 정의 타입 등 어떤 타입도 저장할 수 있습니다.
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers; // 정수형 vector 선언
numbers.push_back(10);
numbers.push_back(20);
numbers.push_back(30);
std::cout << numbers[0] << std::endl; // 10 출력
std::cout << numbers.at(1) << std::endl; // 20 출력
return 0;
}
위 예제처럼 vector는 배열처럼 사용하면서도 훨씬 더 많은 기능을 제공합니다.
또한 안전한 인덱스 접근을 위해 at() 함수를 제공하는 것도 큰 장점 중 하나입니다.
잘못된 인덱스에 접근하면 예외를 발생시켜 프로그램의 안정성을 높여주기 때문이죠.
🛠️ vector의 주요 멤버 함수
C++ vector는 다양한 멤버 함수를 제공하여 배열보다 훨씬 유연하게 데이터를 다룰 수 있습니다.
처음에는 함수가 많아 보일 수 있지만, 실제로는 자주 쓰이는 몇 가지만 제대로 익혀도 실무 활용에 충분합니다.
아래에서 자주 쓰이는 멤버 함수들을 간단한 설명과 함께 정리해볼게요.
- ➕push_back() : vector의 끝에 요소를 추가합니다.
- 🔍at(index) : 특정 위치의 요소에 안전하게 접근합니다.
- 📏size() : vector에 저장된 요소의 개수를 반환합니다.
- ❌clear() : 모든 요소를 삭제하고 빈 상태로 만듭니다.
- 🔁begin(), end() : 반복자(iterator)를 반환하여 루프에서 사용합니다.
이 함수들만 잘 익혀도 vector의 80%는 사용할 수 있습니다.
간단한 예시 코드를 통해 실전에서 어떻게 활용되는지도 살펴볼게요.
#include <iostream>
#include <vector>
int main() {
std::vector<int> v = {1, 2, 3};
v.push_back(4); // 4 추가
std::cout << v.at(2) << "\n"; // 3 출력
std::cout << v.size() << "\n"; // 4 출력
v.clear(); // 전체 삭제
std::cout << v.size() << "\n"; // 0 출력
return 0;
}
함수명을 익히는 것뿐 아니라, 어떤 상황에서 어떤 함수가 적합한지를 이해하는 것이 중요합니다.
이후 실무 코드를 보면 자연스럽게 이 함수들을 조합해 활용하는 패턴이 보일 거예요.
⚙️ vector와 배열의 차이점
처음 C++을 접한 사람이라면 vector와 배열의 차이가 궁금할 수밖에 없습니다.
두 자료형 모두 데이터를 순차적으로 저장할 수 있지만, 사용성과 내부 작동 방식은 꽤 다릅니다.
각각의 특징을 정확히 비교해보면 어떤 상황에서 어떤 도구를 선택해야 할지 명확해집니다.
| 구분 | vector | 배열(array) |
|---|---|---|
| 메모리 크기 | 자동 조절됨 (동적 할당) | 고정 크기 (정적 할당) |
| 요소 추가/삭제 | 간편 (push_back 등 사용) | 복잡 (직접 메모리 관리 필요) |
| 크기 확인 | size() 함수로 가능 | sizeof로 계산 필요 |
| 타입 안정성 | 템플릿 기반으로 타입 보장 | 타입 지정은 명확하지만 제한적 |
| 성능 | 조금 느릴 수 있으나 유연함 | 가장 빠르지만 유연성 낮음 |
위 표를 보면 알 수 있듯이 vector는 편의성과 유연성에서, 배열은 속도와 단순성에서 각각 장점을 가집니다.
따라서 프로그램의 목적과 상황에 따라 적절한 자료구조를 선택하는 것이 중요합니다.
⚠️ 주의: 배열의 크기를 초과해서 접근하면 프로그램이 멈출 수 있지만, vector는 at()을 사용하면 예외 처리가 가능해 안전성이 더 높습니다.
🔌 메모리 관리와 자동 확장 원리
vector가 배열보다 편리한 가장 큰 이유 중 하나는 메모리를 자동으로 관리해 준다는 점입니다.
처음에 vector는 내부적으로 일정 용량(capacity)을 할당하고, 요소가 추가되면 필요한 만큼 용량을 늘려가며 데이터를 저장합니다.
예를 들어 처음에는 4개의 공간이 확보되었다고 가정했을 때, 5번째 데이터를 추가하면 vector는 기존보다 더 큰 메모리 공간을 새로 할당하고 데이터를 복사한 후, 이전 메모리를 해제하는 방식으로 동작합니다.
#include <iostream>
#include <vector>
int main() {
std::vector<int> v;
for (int i = 0; i < 10; ++i) {
v.push_back(i);
std::cout << "size: " << v.size() << ", capacity: " << v.capacity() << std::endl;
}
return 0;
}
위 코드를 실행해보면 vector의 용량(capacity)은 자동으로 늘어나는 것을 확인할 수 있습니다.
size는 실제 요소의 개수이고, capacity는 내부적으로 확보된 공간의 크기를 의미합니다.
💡 TIP: 메모리 낭비를 방지하고 싶다면 shrink_to_fit()이나 reserve() 함수를 적절히 사용하는 것이 좋습니다.
vector는 메모리를 자동으로 관리하므로 초보자도 쉽게 사용할 수 있지만, 내부 동작을 이해하고 있으면 더 최적화된 코드를 작성하는 데 큰 도움이 됩니다.
💡 vector를 사용할 때 주의할 점
vector는 매우 강력한 도구이지만, 모든 상황에서 완벽한 것은 아닙니다.
특히 성능이 중요한 코드나 메모리 제어가 중요한 환경에서는 주의해야 할 점들이 있습니다.
아래는 vector 사용 시 꼭 기억해 두어야 할 주요 주의사항입니다.
- ⚠️중간 삽입/삭제는 속도가 느릴 수 있습니다.
list구조가 더 적합할 수 있습니다. - 🔁반복자(iterator)는 vector의 구조 변경 시 무효화될 수 있으므로 주의해야 합니다.
- 💥
at()대신[]연산자를 사용할 경우 예외 처리가 안 되어 버그 위험이 있습니다. - 📊
capacity()와size()의 차이를 이해하고 있어야 메모리 최적화에 도움이 됩니다.
vector는 일반적으로 안전하고 사용하기 쉬운 컨테이너이지만, 잘못 사용하면 불필요한 성능 저하나 런타임 오류로 이어질 수 있습니다.
따라서 위와 같은 주의사항들을 숙지하고 상황에 따라 list나 deque 같은 다른 STL 컨테이너를 고려하는 유연한 판단도 중요합니다.
💎 핵심 포인트:
vector는 기본적으로 가장 많이 쓰이는 컨테이너지만, 무조건적인 사용보다는 데이터의 특성과 사용 목적에 따라 선택하는 것이 효율적입니다.
❓ 자주 묻는 질문 (FAQ)
vector는 배열과 완전히 같은 방식으로 작동하나요?
vector의 초기 크기를 설정할 수 있나요?
vector<int> v(5, 0);는 0으로 채워진 5개의 요소를 생성합니다.
vector는 메모리를 자동으로 해제하나요?
vector의 요소를 반복문으로 순회하려면 어떻게 하나요?
begin()과 end() 반복자를 사용한 range-based for문도 가능합니다. 예: for (int n : v) {...}
capacity와 size의 차이는 무엇인가요?
중간 삽입이나 삭제는 효율적인가요?
list나 deque가 더 적합합니다.
vector에 사용자 정의 구조체도 저장할 수 있나요?
vector의 모든 요소를 제거하려면 어떻게 하나요?
clear() 함수를 사용하면 vector의 모든 요소를 제거할 수 있으며, size는 0이 되지만 capacity는 유지됩니다.
📌 vector 사용법, 제대로 알고 쓰면 강력한 무기입니다
C++에서 vector는 배열의 단점을 보완한 가장 널리 사용되는 컨테이너 중 하나입니다.
push_back(), at(), size() 같은 직관적인 함수로 데이터를 유연하게 다룰 수 있으며, 자동 메모리 확장 덕분에 복잡한 메모리 처리를 걱정할 필요도 없습니다.
이 글에서는 vector의 개념부터 시작해 주요 함수, 배열과의 차이, 메모리 관리 원리, 그리고 실전 사용 시 주의할 점까지 풍부한 예제와 함께 하나씩 짚어보았습니다.
vector를 잘 활용하면 코드가 더 간결하고 안정적으로 바뀌며, 다양한 문제 해결에도 큰 도움이 됩니다.
처음에는 조금 낯설 수 있지만 반복해서 연습하면 금방 익숙해질 거예요.
STL의 기본 중 기본, vector를 꼭 마스터해보세요!
🏷️ 관련 태그:C++ vector, C++ STL, vector 사용법, 동적 배열, 메모리 자동 관리, push_back 함수, C++ 기초, C++ 배열, 프로그래밍 입문, C++ 예제