배열이란 무엇인가요?
배열은 같은 타입의 값 여러 개를 하나의 연속된 메모리 블록에 저장하는 자료구조입니다. 요소라고 부르는 각 값에는 인덱스라는 위치 번호로 접근하며, 인덱스는 대부분의 언어에서 0부터 시작해요.
업데이트: 2026년 9월 24일
일주일 기온을 보여 주는 날씨 앱에는 숫자 일곱 개가 필요해요. monday, tuesday처럼 변수 일곱 개를 따로 쓸 수도 있지만, 그러면 반복문으로 차례로 훑을 수 없고, 여덟째 날을 추가하려면 새 코드를 써야 해요. 배열은 일곱 숫자를 모두 temperatures라는 이름 하나 아래, 0부터 6까지 번호가 붙은 칸에 넣어요.
배열은 이렇게 동작해요
배열은 요소들을 하나의 메모리 블록에 나란히 두고, 모든 요소가 같은 수의 바이트를 차지해요. 이 배치 덕분에 컴퓨터는 계산 한 번으로 어떤 요소든 찾을 수 있어요.
address of element i = start address + i × element size
32비트 정수(각 4바이트) 배열이 메모리 주소 1000에서 시작한다고 해 볼게요. 요소 0은 1000에, 요소 1은 1004에, 요소 2는 1008에, 요소 3은 1012에 있어요. 요소 3에 가든 요소 3,000,000에 가든 똑같이 한 단계면 돼요. 그래서 인덱스로 배열을 읽는 것을 상수 시간이라고 하고, O(1)로 써요.
파이썬의 array 모듈은 숫자를 이런 방식으로 그대로 저장하기 때문에, 이 계산을 직접 확인할 수 있어요.
4 bytes per element
16 bytes in total
scores[0] = 90 at address 1000
scores[1] = 75 at address 1004
scores[2] = 88 at address 1008
scores[3] = 62 at address 1012
이 공식은 대부분의 언어가 0부터 세는 이유도 설명해 줘요. 인덱스는 오프셋, 즉 시작점에서 몇 개의 요소를 건너뛸지예요. 첫 요소는 시작점에서 요소 0개만큼 떨어져 있으니 인덱스가 0이고, 길이가 n인 배열의 마지막 요소는 인덱스가 n − 1이에요. Lua, MATLAB, R, Fortran 같은 몇몇 언어는 1부터 시작해요.
파이썬에서 배열 쓰기
대부분의 파이썬 코드는 내장 list를 배열로 써요. 대괄호로 만들고, 인덱스로 요소를 읽고 바꾸고, len()으로 길이를 구해요.
18
25
19
5
[18, 22, 25, 23, 19, 20]
음수 인덱스는 끝에서부터 세기 때문에 temperatures[-1]은 마지막 요소예요. 이 지름길은 파이썬의 것이고, C와 자바에는 음수 인덱스가 없어요.
배열 연산의 비용
연속된 배치 덕분에 어떤 연산은 빠르고 어떤 연산은 느려요. 비용은 요소의 개수 n에 따라 커져요.
| 연산 | 파이썬 예 | 비용 |
|---|---|---|
| 인덱스로 요소 읽기, 바꾸기 | a[3] = 7 | O(1), 한 단계 |
| 끝에 요소 추가 | a.append(7) | 평균 O(1) |
| 맨 앞에 삽입, 맨 앞에서 삭제 | a.insert(0, 7) | O(n), 모든 요소가 이동 |
| 정렬되지 않은 배열에서 값 찾기 | 7 in a | O(n), 하나씩 확인 |
| 정렬된 배열에서 값 찾기 | 이진 탐색 | O(log n) |
맨 앞에 삽입하면 자리를 만들기 위해 모든 요소가 한 칸씩 옮겨야 해서 느려요. 정렬되지 않은 배열을 검색하려면 요소를 차례로 확인하는 선형 탐색을 해야 하지만, 정렬된 배열에서는 매 단계 남은 범위를 절반으로 줄이는 이진 탐색을 쓸 수 있어요.
배열을 반복문으로 훑기
배열과 반복문은 함께 다녀요. 반복문이 요소를 차례로 방문하는 것을 반복이라고 해요. 같은 몇 줄로 요소 5개짜리 배열도, 500만 개짜리 배열도 처리해요.
Total: 28.5
Most expensive: 12.0
다른 언어의 배열
C에서 배열은 선언할 때 정한 고정 크기를 가지고, 한 타입의 값을 그대로 담아요. sizeof는 배열의 크기를 바이트로 알려 줘요.
int scores[5] = {90, 75, 88, 62, 100}; /* 5 × 4 bytes = 20 bytes */
자바 배열도 길이가 고정되어 있고, 새 요소는 숫자라면 0 같은 기본값으로 시작해요. 늘어나는 배열이 필요하면 ArrayList를 써요.
int[] scores = new int[5]; // five elements, all 0
scores[0] = 90;
자바스크립트 배열은 자유롭게 늘고 줄며, [1, "two", true]처럼 타입을 섞을 수 있어요.
파이썬의 list, 자바의 ArrayList, C++의 std::vector처럼 늘어나는 배열을 동적 배열이라고 해요. 동적 배열은 끝에 여유 공간을 확보해 둬요. 그 공간이 다 차면 더 큰 블록을 할당하고, 모든 요소를 거기로 복사한 뒤 계속 써요. 복사는 드물게 일어나서 추가 연산은 평균적으로 빠르게 유지돼요.
배열이 다른 배열을 담을 수도 있어요. grid[row][col]은 2차원 배열의 칸 하나를 읽고, 이런 배치를 게임판, 스프레드시트, 이미지에 써요. C 다차원 배열 가이드에서 이것이 메모리에 어떻게 놓이는지 볼 수 있어요.
흔한 실수
하나 차이 오류(off by one). 요소가 3개인 배열의 인덱스는 0, 1, 2이므로 인덱스 3은 끝을 넘어가요. 파이썬은 오류를 내고 멈춰요.
IndexError: list index out of range
자바는 ArrayIndexOutOfBoundsException을 던지고, 자바스크립트는 조용히 undefined를 돌려줘요. C는 아무 검사도 하지 않아요. 끝을 넘어 읽는 것은 정의되지 않은 동작이라서, 쓰레기 값이 나오거나 세그멘테이션 오류로 프로그램이 죽을 수 있어요.
할당으로 복사하기. 파이썬, 자바, 자바스크립트에서 b = a는 배열을 복사하지 않아요. 두 이름이 같은 배열을 가리키기 때문에 b를 바꾸면 a도 바뀌어요. 진짜 복사본이 필요하면 파이썬에서는 a.copy()를, 자바스크립트에서는 [...a]를 쓰세요. 이유는 변수 페이지에서 설명해요.
다음으로 읽을 내용
배열은 차례로 훑는 반복문이 있어야 쓸모가 있으니, 다음으로 반복이란 무엇인지를 읽고, 위에 나온 요소 크기의 단위는 바이트란 무엇인지에서 확인하세요. 파이썬 리스트 가이드는 슬라이싱, 정렬, 리스트 메서드를 다루고, 연결 리스트 시각화는 빠른 인덱스 접근 대신 빠른 삽입을 택한 구조를 보여 줘요.
자주 묻는 질문
수학에서 배열이란 무엇인가요?
배열의 예로는 어떤 것이 있나요?
[18, 21, 25, 23, 19, 17, 20]은 숫자 일곱 개의 배열이고, temperatures[0]은 월요일 값이에요. 이미지 한 줄의 픽셀, 문자열의 글자들, 게임 순위표의 점수도 일상적인 예예요.아이에게 배열을 어떻게 설명하면 좋을까요?
배열 안에는 무엇이 들어 있나요?
int이거나 모두 double인 식이죠. 파이썬 리스트와 자바스크립트 배열은 값 자체가 아니라 값에 대한 참조를 저장하기 때문에 타입을 섞을 수 있어요.배열과 리스트는 무엇이 다른가요?
list는 연결 리스트가 아니라, 요소를 추가하면 커지는 동적 배열이에요.