본문 바로가기
✍️ doodle

왜 index 는 0부터 시작할까?

by HandHand 2023. 3. 12.

 

얼마전 프로그래밍을 이제 막 시작한 지인분이 다음 질문을 주셨습니다.

이제 막 프로그래밍을 시작한 사람이라면 누구나 한번 쯤 의문을 품을만한 것이라고 생각합니다.

 

왜 배열의 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 을 채택해서 지금까지 널리 사용되고 있습니다. 😄

 

📌 참고자료

Zero-based numbering

반응형

'✍️ doodle' 카테고리의 다른 글

카카오뱅크 이직 후기  (5) 2025.07.19
슬기로운 몹 프로그래밍  (0) 2025.05.08
나의 2022년도는 어땠을까?  (0) 2022.12.31
개발자 경험(DX) 톺아보기  (0) 2022.08.09
Mixin을 사용해보며 느낀점들  (0) 2022.07.02

💬 댓글