스택(stack)은 일반적으로 사용할 수 있는 공간이 매우 제한적이기 때문에, 잠재적으로 크기가 큰 배열을 스택에 생성해야 하는 상황은 바람직하지 않습니다. 배열의 크기를 미리 알고 있다면 정적(static) 배열을 사용하면 되지만, 크기를 미리 알 수 없다면 안전하지 않은 코드를 작성할 위험이 커집니다.
VLA가 C++ 표준에 없는 핵심 이유
가변 길이 배열(VLA, Variable-Length Array)이 C++에 기본 기능으로 포함되지 않는 결정적인 이유는 타입 시스템에 대한 대규모 변경이 필요하기 때문입니다. 참고로 C 언어는 C99 표준에서 VLA를 도입했지만, C++ 표준화 위원회는 타입 시스템의 복잡성 증가와 안정성 문제를 이유로 이를 채택하지 않았습니다.
C++의 대안: std::vector
C++에서는 STL(표준 템플릿 라이브러리)이 제공하는 std::vector가 가변 길이 배열의 훌륭한 대안입니다. vector는 힙(heap) 메모리를 사용해 실행 중에 크기를 동적으로 늘리거나 줄일 수 있으며, 메모리를 자동으로 관리해 주기 때문에 훨씬 안전하고 유연합니다. 다음과 같이 사용할 수 있습니다 −
예제
#include<iostream>
#include<vector>
using namespace std;
int main() {
vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
vec.push_back(4);
vec.push_back(5);
// ...
// 반복자(iterator)를 사용한 순회:
for(vector<int>::iterator it = vec.begin(); it != vec.end(); it++) {
cout << *it << endl;
}
return 0;
}출력 결과
위 코드를 실행하면 다음과 같은 출력을 얻을 수 있습니다 −
1 2 3 4 5
참고로 C++11 이상에서는 범위 기반 for문(range-based for loop)을 사용하면 더욱 간결하게 순회할 수 있습니다. 예를 들어 for(int x : vec) cout << x << endl;처럼 작성하면 됩니다. 이처럼 std::vector는 VLA 없이도 동적 크기의 배열이 필요한 대부분의 상황을 안전하고 효율적으로 해결해 줍니다.