
얼마전 프로그래밍을 이제 막 시작한 지인분이 다음 질문을 주셨습니다.
이제 막 프로그래밍을 시작한 사람이라면 누구나 한번 쯤 의문을 품을만한 것이라고 생각합니다.
왜 배열의 index 가 0부터 시작하는 것인가요?
저 또한 처음 C언어로 프로그래밍에 입문 했을 때 0부터 시작하는 인덱싱 체계가 낯설었지만
그때 당시에는 그냥 그런가보다~ 하고 받아들이고 넘어갔었는데,
이번 기회에 알아보면 좋을 것 같다는 생각이 들어서 이와 관련된 몇가지 배경을 찾아보고 정리해봤습니다.
📌 TL;DR
0부터 시작하는 인덱스는 자연스럽고 직관적이며, 배열의 첫 번째 원소가 항상 0번 인덱스라는 점에서 이점이 있다.
또 다른 이유는, 0부터 시작하는 인덱스는 메모리 주소를 계산하기 쉽게 만들어준다.
📌 자연스럽고 직관적이다
0-based 가 직관적인 이유는 구간 을 나타내는 방법을 먼저 정의하는 것을 통해 도출할 수 있습니다.
최단경로 알고리즘 으로 유명한 다익스트라 는 그가 작성한 하나의 메모를 통해
구간을 표현하는 다음 4가지 표현식 중 가장 자연스럽고 직관적인 방법을 도출하는 하나의 의견을 제안했습니다.
a. 2 <= i < 13
b. 1 < i <= 12
c. 2 <= i <= 12
d. 1 < i < 13
위 4가지 방법중에 어떤걸 사용하는게 좋을까요?
가장 작은 자연수 N 을 포함하는 구간을 표현한다고 가정하겠습니다.
이때 lower bound 에서 경계값을 포함하지 않는다면(<) 그보다 작은 임의의 실수값을 사용해야하지만,
경계값을 포함하도록 하면(≤) 의도에 좀 더 맞는 표현 방법이 될 수 있는 것입니다.
또한 upper bound 에서는 경계값을 포함할 경우 실수값을 사용하지 않는 이상 공집합을 표현하기가 불가능해집니다.
따라서 이러한 이유들 때문에 a 와 같은 반닫힌구간 을 사용하면
좀 더 의미에 맞고 직관적인 표현이 가능해집니다.
이제 인덱스가 0부터 시작하는게 자연스러운 이유를 알아보겠습니다.
총 길이가 N 인 배열의 구간을 표현하고 싶다면 다음 두 가지 방법이 있을 것입니다.
1. 1 <= i < N + 1 // ✅ 1-based
2. 0 <= i < N // ✅ 0-based
두번째 방법인 0-based 를 사용하면 닫힌 구간의 수를 보기만 해도
수열의 길이가 N 임을 바로 계산할 수 있으며 이는 연속적인 구간에서도 훨씬 직관적입니다.
📌 메모리 주소 계산이 쉬워진다
C와 같은 프로그래밍 언어에서 특정 영역의 메모리 주소는 기준 주소와 offset 으로 계산됩니다.
기준 주소가 a 이고 각 프레임의 크기가 s 라고 할때,
i 번째 프레임의 주소값은 다음과 같은 등차수열의 일반항을 통해 계산할 수 있습니다.
a + s * (i - 1) // ✅ 1-based
a + s * i // ✅ 0-based
여기서 0-based 방식은 런타임에 계산하기에 좀더 효율적이라는 이점이 있습니다.
또한 이는 모듈러 연산을 통한 인덱스 매핑을 수행할때도 간결하게 표현이 가능해집니다.
앞서 살펴본 이러한 여러가지 장점들 때문에 많은 프로그래밍 언어에서
0-based indexing 을 채택해서 지금까지 널리 사용되고 있습니다. 😄
📌 참고자료
'✍️ doodle' 카테고리의 다른 글
| 카카오뱅크 이직 후기 (5) | 2025.07.19 |
|---|---|
| 슬기로운 몹 프로그래밍 (0) | 2025.05.08 |
| 나의 2022년도는 어땠을까? (0) | 2022.12.31 |
| 개발자 경험(DX) 톺아보기 (0) | 2022.08.09 |
| Mixin을 사용해보며 느낀점들 (0) | 2022.07.02 |
💬 댓글