C++에서 가장 일반적으로 사용되는 배열인 [ 정적 배열, STL 벡터, STL 배열 ]의 길이 구하는 방법에 대해 알아보겠다.
컴파일 시 크기가 고정되는 배열이다.
#include <iostream>
using namespace std;
int main() {
int arr[] = {1, 2, 3, 4, 5};
size_t length = sizeof(arr) / sizeof(arr[0]);
cout << "배열 길이: " << length << endl;
return 0;
}
*sizeof() 연산자란?
데이터 타입이나 객체의 메모리 크기를 Byte 단위로 반환하는 연산자(Operator)다. size_t 타입을 반환한다. 연산자이므로 컴파일 타임에 처리된다.
*size_t란?
C++에서 배열의 크기나 메모리의 크기를 표현할 때 사용되는 Unsigned 정수형 타입이다. 사용 시 [ int ] 보다 훨 있어 보인다. stddef.h 또는 cstdef 헤더 파일에 정의되어 있다.
*sizeof(arr) / sizeof(arr[0])인 이유?
arr은 배열의 변수명이지만 동시에 배열의 전체를 나타내므로, 배열이 메모리에 할당된 실제 크기를 반환한다. arr[0]은 배열의 첫 번째 요소의 크기를 반환한다. 즉, 정수형 원소가 5개인 배열은 메모리에 실제로 20byte가 할당돼있고, 첫 번째 원소인 정수형의 크기인 4byte로 나눠 5개임을 도출해낸다.
벡터는 크기가 동적으로 변경 가능한 배열이다. size() 멤버 함수를 사용하여 길이를 구한다.
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> vec = {1, 2, 3, 4, 5};
cout << "벡터 길이: " << vec.size() << endl;
return 0;
}
*vector는 class다
데이터를 저장/관리하는 클래스로, 멤버 함수를 제공한다.
*vector는 동적이다
선언 시에 지정한 크기만큼만 메모리에 할당되고, 추가로 필요할 때마다 2배씩 증가한다.
C++ 11 이상부터 사용 가능하며, 정적 배열처럼 고정 크기를 가진다. size() 멤버 함수를 제공하여 쉽게 배열 길이를 얻을 수 있다.
#include <iostream>
#include <array>
using namespace std;
int main() {
array<int, 5> arr = {1, 2, 3, 4, 5};
cout << "std::array 길이: " << arr.size() << endl;
return 0;
}
*배열과 STL 배열의 차이점
일반 배열은 범위 체크 기능이 없고 배열 크기 정보를 따로 관리해야 하는 등 제한적이다. STL 배열은 범위 체크, 이터레이터 등 더 편리한 기능을 많이 갖고 있다.