33.1 배열을 선언하고 요소에 접근하기

배열은 변수 이름 뒤에 [ ] (대괄호)를 붙인 뒤 크기를 설정합니다. 그리고 배열을 선언하면서 값을 초기화할 때는 { } (중괄호)를 사용합니다.

  • 자료형 배열이름[크기];
  • 자료형 배열이름[크기] = { 값, 값, 값 };

다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요.

array.c

#include <stdio.h>

int main()
{
    int numArr[10] = { 11, 22, 33, 44, 55, 66, 77, 88, 99, 110 };    // 배열을 생성하고 값 할당

    printf("%d\n", numArr[0]);    // 11: 배열의 첫 번째(인덱스 0) 요소 출력
    printf("%d\n", numArr[5]);    // 66: 배열의 여섯 번째(인덱스 5) 요소 출력
    printf("%d\n", numArr[9]);    // 110: 배열의 열 번째(인덱스 9) 요소 출력

    return 0;
}

실행 결과

11
66
110

int numArr[10]은 크기가 10int형 배열을 선언한다는 뜻입니다. 배열을 선언하면서 값을 초기화 할 때는 { } 안의 값 개수는 배열의 크기보다 작아도 되지만 크면 안 됩니다. 또한, { }를 사용하여 배열에 값을 할당하는 방법은 배열을 선언할 때만 사용할 수 있으며 이미 선언된 배열에는 사용할 수 없습니다.

배열에 값이 저장된 공간을 요소(element)라고 합니다. 배열에서 각 요소에 접근하려면 배열 뒤에 [ ] (대괄호)를 사용하며 [ ] 안에 각 요소의 인덱스를 지정해주면 됩니다.

  • 배열[인덱스]
numArr[0];    // 첫 번째 요소, 인덱스 0
numArr[5];    // 여섯 번째 요소, 인덱스 5
numArr[9];    // 열 번째 요소, 인덱스 9

여기서 주의할 점은 배열의 인덱스는 항상 0부터 시작한다는 점입니다. 따라서 배열 numArr의 첫 번째 요소는 numArr[0]이 됩니다.

그림 33‑1 인덱스로 배열의 요소에 접근
참고 | 배열 선언과 배열 인덱스

배열을 선언할 때도 [ ]를 사용하고 배열의 요소에 접근할 때도 [ ]를 사용합니다. 같은 [ ] 기호를 사용해서 헷갈리기 쉽지만 선언과 사용을 구분해서 생각하면 됩니다. 즉, 배열을 선언할 때 [ ]"이 변수가 배열이고 크기는 얼마다"라고 알려주는 역할이고, 배열을 사용할 때 [ ]"배열의 요소에 접근하겠다"는 뜻입니다.

요소가 0개인 배열은 선언할 수 없습니다. 따라서 배열을 선언할 때 크기는 항상 1 이상입니다. 하지만 배열에 접근할 때는 인덱스가 0부터 시작합니다.

int numArr[0];    // 컴파일 에러. 크기가 0인 배열은 선언할 수 없음
int numArr[1];    // 크기가 1인 배열. 요소가 1개
numArr[0];        // 배열의 첫 번째 요소, 인덱스 0에 접근

배열의 인덱스가 0부터 시작하는 이유는 메모리 주소가 0부터 시작하기 때문입니다. 배열도 포인터이므로 인덱스가 0부터 시작하면 요소 접근과 포인터 연산이 일치하게 됩니다.

보통 C 언어를 비롯한 많은 프로그래밍 언어들은 배열의 인덱스가 0부터 시작하지만 Lua는 1부터 시작합니다. 배열의 인덱스는 절대적인 기준이 아니며 언어의 구현에 따라서 달라질 수 있습니다.

참고 | 배열을 선언할 때 크기 생략하기

배열을 선언할 때 값을 초기화한다면 배열의 크기를 생략할 수 있습니다(초기화를 하지 않을 때는 생략할 수 없습니다).

  • 자료형 배열이름[] = { 값, 값, 값 };
int numArr1[] = { 11, 22, 33, 44, 55, 66, 77, 88, 99, 110 };    // 배열의 크기 생략

int numArr2[];    // 컴파일 에러