배열(Array)
배열(array)은 같은 타입의 변수들로 이루어진 유한 집합으로 정의할 수 있습니다.
배열을 구성하는 각각의 값을 배열 요소(element)라고 하며, 배열에서의 위치를 가리키는 숫자를 인덱스(index)라고 합니다.
C++에서 인덱스는 언제나 0부터 시작하며, 0을 포함한 양의 정수만을 가질 수 있습니다.
배열은 같은 종류의 데이터를 많이 다뤄야 하는 경우에 사용할 수 있는 가장 기본적인 자료 구조입니다.
배열은 선언되는 형식에 따라 1차원 배열, 2차원 배열뿐만 아니라 그 이상의 다차원 배열로도 선언할 수 있습니다.
하지만 현실적으로 이해하기가 쉬운 2차원 배열까지가 많이 사용됩니다.
배열 선언
배열은 다음과 같이 선언할 수 있습니다.
문법
타입 배열이름 [배열 길이];
변수와 마찬가지로 선언 후 따로 초기화해줄 수도 있으며, 선언과 동시에 초기화해줄 수도 있습니다.
예제
// 선언 후 초기화 int arr1[3]; arr[0] = 1; arr[1] = 2; arr[2] = 3; // 선언과 동시에 초기화 int arr2[3] = {11, 22, 33}; int arr3[3]; arr3[3] = {111, 222, 333}; // 오류 발생! int arr0[3] = { }; // int arr0[3] = {0, 0, 0}와 같다
주의할 점은, arr3
처럼 배열을 선언해놓은 후 arr3[3] = {111, 222, 333}
처럼 초기화는 불가능합니다.
Curly Bracket({ }
)으로 초기화하려면 선언과 동시에 초기화해주어야 합니다.
뿐만 아니라, arr1
과 arr2
의 index 크기가 같다고 해서 다음과 같이 대입할 수 없습니다.
arr0
처럼 빈 괄호({ }
)로 배열을 초기화하면 모든 항목이 0으로 초기화됩니다.
arr1 = arr2 // 오류 발생!
배열의 길이
배열의 길이, 즉 원소의 개수를 구하는 방법은 다음과 같습니다.
sizeof(배열 이름) / sizeof(배열 이름[0])
여기서 sizeof(arg)
함수는 arg의 크기를 byte로 반환하는 함수입니다.
따라서 sizeof(배열 이름)
은 배열 전체에 할당된 메모리의 크기를 나타내며, sizeof(배열이름[0])
은 첫번째 인덱스에 있는 요소의 크기를 나타냅니다.
배열에는 모두 같은 종류의 요소들이 들어가므로, sizeof(배열 이름) / sizeof(배열 이름[0])
은 첫번째 인덱스와 같은 크기의 요소들이 배열에 총 몇개 존재하는지를 나타냅니다.
그렇다면, 만약 다음처럼 index의 길이를 지정해주지 않으면 어떤 일이 일어날까요?
int noIndex[] = {0, 1, 2, 3, 4};
int index = sizeof(noIndex) / sizeof(noIndex[0])
cout << index // 5
이렇게 배열의 길이를 지정해주지 않게 되면, 배열의 요소 개수에 맞춰 자동으로 배열의 길이가 설정됩니다.
Array Template Class?
C++11부터는 array의 템플릿 클래스가 추가되었습니다.
#include <array>
를 통해 기존 C 스타일이 아닌 새로운 형태로 더 간편하게 배열을 정의하고 이용할 수 있습니다.
다음 포스트에서는 이 내용에 대해 다루도록 하겠습니다.