[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;
}

단점

  • 배열의 크기를 명시적으로 지정해야 합니다.

  • 항상 스택 메모리를 사용하기 때문에 대용량 데이터를 저장하기 위해 사용할 수 없습니다.

  • 고정 크기 배열입니다.


포스팅을 마치며

이번에는 기본적인 배열과 C++ style 배열에 대해 정리해 봤습니다.

Reference

황선규. C++ 어서와! 자료 구조와 알고리즘은 처음이지?. Programmers.

좋은 웹페이지 즐겨찾기