[2022.04.19] 배열
이번 포스팅에서는 배열에 대해 알아보도록 하겠습니다.
배열
배열(Array)은 같은 종류의 데이터가 연속적으로 저장되어 있는 자료 구조를 말합니다.
선언
배열을 선언하면 같은 종류의 데이터를 연속적으로 저장할 수 있는 공간이 메모리에 할당됩니다.
int scores[5]; // C Style 배열 선언 예
-
배열은 선언할 때 상수 또는 상수 표현식으로 크기를 지정해 줘야 하며, 배열의 크기는 불변입니다.
-
배열을 선언할 때 배열의 크기는 일반적으로 변수를 사용하지 않고 상수를 사용해 선언합니다.
-
배열을 지역 변수로 선언하면 메모리의 스택 영역에 할당되며, 스택 영역의 크기를 초과하는 너무 큰 배열을 할당하게 되면 스택 오버플로가 발생해 프로그램이 강제 종료됩니다.
접근
배열은 인덱스를 이용해 배열의 원소에 접근합니다.
인덱스(Index)는 기본적으로 0부터 시작하는 zero-based numbering을 사용합니다.
- 시작 주소(BA, Base Address)는 배열의 0번째 원소가 저장되어 있는 주소를 말합니다.
- 원소 하나에 필요한 메모리 크기는 sizeof(type)을 이용해 구할 수 있으며, int형의 경우 원소 하나에 필요한 메모리의 크기는 4byte입니다.
특징
-
배열의 접근은 인덱스를 사용하여 원하는 원소에 곧바로 접근하므로 시간 복잡도가 O(1)입니다.
-
배열은 캐시 지역성을 가집니다.
캐시 지역성(Cache locality)이란?
데이터의 접근이 시간적, 공간적으로 가깝게 일어나는 것을 의미합니다. 배열의 각 원소는 서로 인접해 있기 때문에 하나의 원소에 접근할 때 그 근방에 있는 원소도 함께 캐시로 가져오게 됩니다. 따라서, 배열은 공간적 지역성을 가집니다. -
캐시 지역성을 가지기 때문에 반복문에서 배열을 사용하면 효율적인 프로그래밍이 가능합니다.
std::array
std::array란?
C++에서 C 스타일 배열을 대체하는 고정 크기 컨테이너이며, C++11부터 지원합니다. std::array는 원소의 타입과 배열의 크기를 매개변수로 사용하는 클래스 템플릿이며, array 헤더 파일에 정의되어 있습니다.
특징
-
C 스타일 배열처럼 사용할 수 있는 대괄호 연산자 오버 로딩을 제공합니다.
-
깊은 복사를 하는 대입 연산자를 지원합니다.
-
array::size()를 이용해 배열 크기를 정확하게 알 수 있습니다.
-
반복자를 지원합니다.
C style array와 std::array 비교
- C style array를 활용한 평균 점수 구하기 코드입니다.
#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;
}
- std::array를 활용한 평균 점수 구하기 코드입니다.
#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;
}
단점
-
배열의 크기를 명시적으로 지정해야 합니다.
-
항상 스택 메모리를 사용하기 때문에 대용량 데이터를 저장하기 위해 사용할 수 없습니다.
-
고정 크기 배열입니다.
포스팅을 마치며
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 배열에 대해 정리해 봤습니다.
Reference
황선규. C++ 어서와! 자료 구조와 알고리즘은 처음이지?. Programmers.
Author And Source
이 문제에 관하여([2022.04.19] 배열), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jacob3015/2022.04.19-배열저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)