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]은 크기가 10인 int형 배열을 선언한다는 뜻입니다. 배열을 선언하면서 값을 초기화 할 때는 { } 안의 값 개수는 배열의 크기보다 작아도 되지만 크면 안 됩니다. 또한, { }를 사용하여 배열에 값을 할당하는 방법은 배열을 선언할 때만 사용할 수 있으며 이미 선언된 배열에는 사용할 수 없습니다.
배열에 값이 저장된 공간을 요소(element)라고 합니다. 배열에서 각 요소에 접근하려면 배열 뒤에 [ ] (대괄호)를 사용하며 [ ] 안에 각 요소의 인덱스를 지정해주면 됩니다.
- 배열[인덱스]
numArr[0]; // 첫 번째 요소, 인덱스 0 numArr[5]; // 여섯 번째 요소, 인덱스 5 numArr[9]; // 열 번째 요소, 인덱스 9
여기서 주의할 점은 배열의 인덱스는 항상 0부터 시작한다는 점입니다. 따라서 배열 numArr의 첫 번째 요소는 numArr[0]이 됩니다.
배열을 선언할 때도 [ ]를 사용하고 배열의 요소에 접근할 때도 [ ]를 사용합니다. 같은 [ ] 기호를 사용해서 헷갈리기 쉽지만 선언과 사용을 구분해서 생각하면 됩니다. 즉, 배열을 선언할 때 [ ]는 "이 변수가 배열이고 크기는 얼마다"라고 알려주는 역할이고, 배열을 사용할 때 [ ]는 "배열의 요소에 접근하겠다"는 뜻입니다.
요소가 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[]; // 컴파일 에러