이번 포스팅에서는 배열에 대해 알아보도록 하겠습니다.
배열(Array)은 같은 종류의 데이터가 연속적으로 저장되어 있는 자료 구조를 말합니다.
배열을 선언하면 같은 종류의 데이터를 연속적으로 저장할 수 있는 공간이 메모리에 할당됩니다.
int scores[5]; // C Style 배열 선언 예
배열은 선언할 때 상수 또는 상수 표현식으로 크기를 지정해 줘야 하며, 배열의 크기는 불변입니다.
배열을 선언할 때 배열의 크기는 일반적으로 변수를 사용하지 않고 상수를 사용해 선언합니다.
배열을 지역 변수로 선언하면 메모리의 스택 영역에 할당되며, 스택 영역의 크기를 초과하는 너무 큰 배열을 할당하게 되면 스택 오버플로가 발생해 프로그램이 강제 종료됩니다.
배열은 인덱스를 이용해 배열의 원소에 접근합니다.
인덱스(Index)는 기본적으로 0부터 시작하는 zero-based numbering을 사용합니다.
배열의 접근은 인덱스를 사용하여 원하는 원소에 곧바로 접근하므로 시간 복잡도가 O(1)입니다.
배열은 캐시 지역성을 가집니다.
캐시 지역성(Cache locality)이란?
데이터의 접근이 시간적, 공간적으로 가깝게 일어나는 것을 의미합니다. 배열의 각 원소는 서로 인접해 있기 때문에 하나의 원소에 접근할 때 그 근방에 있는 원소도 함께 캐시로 가져오게 됩니다. 따라서, 배열은 공간적 지역성을 가집니다.
캐시 지역성을 가지기 때문에 반복문에서 배열을 사용하면 효율적인 프로그래밍이 가능합니다.
std::array란?
C++에서 C 스타일 배열을 대체하는 고정 크기 컨테이너이며, C++11부터 지원합니다. std::array는 원소의 타입과 배열의 크기를 매개변수로 사용하는 클래스 템플릿이며, array 헤더 파일에 정의되어 있습니다.
C 스타일 배열처럼 사용할 수 있는 대괄호 연산자 오버 로딩을 제공합니다.
깊은 복사를 하는 대입 연산자를 지원합니다.
array::size()를 이용해 배열 크기를 정확하게 알 수 있습니다.
반복자를 지원합니다.
#include <iostream>
using namespace std;
int main()
{
// C style array example
int scores[5] = {50, 60, 70, 80, 90};
int sz = sizeof(scores) / sizeof(int);
int sum = 0;
for (int i = 0; i < sz; i++) {
sum += scores[i];
}
float mean = (float) sum / sz;
cout << "Mean score: " << mean << endl;
}
#include <iostream>
#include <array>
using namespace std;
int main()
{
// Cpp style array example
array<int, 5> scores = {50, 60, 70, 80, 90};
int sum = 0;
for (const int& s : scores) {
sum += s;
}
float mean = (float) sum / scores.size();
cout << "Mean score : " << mean << endl;
}
배열의 크기를 명시적으로 지정해야 합니다.
항상 스택 메모리를 사용하기 때문에 대용량 데이터를 저장하기 위해 사용할 수 없습니다.
고정 크기 배열입니다.
이번에는 기본적인 배열과 C++ style 배열에 대해 정리해 봤습니다.
황선규. C++ 어서와! 자료 구조와 알고리즘은 처음이지?. Programmers.