이 의문이 든 것은 배열의 인덱스와 N번째 요소를 페어링하여 코드를 작성할 때 문득 든 것입니다.
아마 프로그래밍을 처음 배우는 사람들은 한번쯤 거쳐가는 질문이었을 것입니다.
사실 간단히 어떤 이유에서이겠거니라는 추측은 하고 있었는데, 이것 저것 찾다가 가장 설득이 되었던 글을 모아보았습니다.
Why numbering should start at zero (1982)
- 수열을 표시할 때, 왜 0부터 시작하는 것이 좋은지 서술하는 글입니다.
- 어떻게 수열을 표시할 수 있는지 예시를 제시합니다.
- 길이가 N인 시퀀스를 표시할 때
0<=i<N
로 표시하는 편이 `1<=i<N+1` 보다 알아보기 좋습니다. - 그러므로 가장 작은 자연수 시작점은 0이 되는 것이 자연스럽습니다.
- 길이가 N인 시퀀스를 표시할 때
So let us let our ordinals start at zero: an element's ordinal (subscript) equals the number of elements preceding it in the sequence. And the moral of the story is that we had better regard —after all those centuries!— zero as a most natural number.
Why The Array Index Should Start From 0 (2008)
- 왜 C/C++에서 index를 0부터 시작했는지에 대한 글입니다.
- C/C++을 근거로하여 Java 등 다양한 언어에서도 0부터 인덱스를 시작하길 채택하였습니다.
- 결론은 Index란 디스크 메모리와 긴밀한 연관성을 가지고 있습니다. 배열의 `시작요소부터 n 요소 떨어진` 메모리 위치를 뜻하는 것이 index 이기 때문입니다. 따라서 시작지점의 요소는
array[0]
로 표시할 수 있습니다.- 즉 Index는 오프셋으로 사용됩니다.
- 0부터 표기하기 시작하면 주소를 계산하기도 편합니다.
👀 리스트에서 데이터 길이가 8bit인 데이터에 대해
3 요소 떨어진 메모리 위치(3번째 요소 위치)를 컴퓨터가 계산하는 방법
1. 0부터 시작할 때
`list[2]` = 원점으로부터 `8*2 = 16bit` 떨어진 곳 부터 시작 (💻 편안~)
2. 1부터 시작할 때
`list[3]` = 원점으로부터 `8*(3-1) = 16bit` 떨어진 곳부터 시작 (💻 매번 -1을 해주어야함)
- 더불어 가장 작은 자연수인 0을 표현하고, 요소가 0개인 `빈 배열`도 표기할 수 있기 위해서 다음과 같은 코드 포맷이 유용하다고 정리하였습니다.
for(i=0;i<N;i++)
{
sum+= a[i];
}