배열의 index는 왜 0부터 시작할까?

토즐라·2022년 6월 15일
3

1D1Q

목록 보기
3/7
post-thumbnail

Question

배열의 index는 왜 0부터 시작할까? 🤔


00. 개요

C, Java, Python등 많은 프로그래밍 언어에서 배열의 index는 1이 아닌 0부터 시작합니다. 그렇다면 어떠한 이유로 배열의 index는 0부터 세는 것인지 차근차근 알아보겠습니다.


01. 배열에서 index의 의미

배열이란 무엇인가

배열에 대한 정리

배열이란 같은 타입의 변수들로 이루어진 유한 집합으로 정의됩니다.
우리는 배열을 다음과 같은 두 가지 요소로 표현할 수 있습니다.

  1. 배열의 시작 주소
  2. 배열의 값의 크기

그럼 이렇게 두 요소를 우선 C언어에서 어떻게 표현할 수 있을지 알아보겠습니다.

C에서의 배열

배열은 C에서 정말 많이 쓰는 자료구조이며, 많은 고급 자료 구조를 표현하는 데 이용됩니다.
배열은 메모리상 연속된 공간에 잡힙니다. 코딩을 통해 특정 메모리에 할당하라고 명령할 수는 없지만, 메모리를 잡을 때 특정 메모리(Base Memory)부터는 연속적으로 저장됩니다.

예시로 5개의 정수 데이터를 담는 배열을 하나 선언해보겠습니다.

int nums[5] = {1, 2, 3, 4, 5};

이렇게 배열을 선언하면 C의 int 데이터 타입은 자료 하나당 4byte의 공간을 차지하므로 메모리에 다음과 같이 배열이 할당되게 됩니다.

여기서 우리는 각 데이터의 시작 주소를 쉽게 계산할 수 있습니다.

시작 주소인덱스
11000+401000 + 4 * 00
21000+411000 + 4 * 11
31000+421000 + 4 * 22
41000+431000 + 4 * 33
51000+441000 + 4 * 44

이를 바탕으로 우리는 왜 인덱스가 1이 아닌 0부터 시작하는지에 대한 이유를 알 수 있습니다.
배열의 시작주소에서 item size에 인덱스를 곱한 값을 더하면 바로 각 item의 시작 주소를 계산할 수 있기 때문이죠.


02. 다익스트라의 해설

추가로, 재미있는 의견으로 다익스트라의 해설이 있습니다.

다익스트라의 해설은 컴퓨터공학을 공부해본 학생이라면 무조건 들어보셨을 다익스트라 교수가 1982년에 왜 인덱싱은 0부터 시작하고 마지막 수는 포함하지 않아야 하는가 에 대한 이유를 몇 가지 적은 노트입니다.

다익스트라 알고리즘을 공부하며 이 분의 이름을 처음 접했고, 어떤 과목을 공부하든 뜬금없이 등장하시는 모습을 보고 정말 대단한 사람이구나 싶었는데, 이 자료를 접하고 또 감회가 새로웠습니다.

다익스트라의 노트

이 분의 주장은 다음과 같습니다.

3.1 인덱스로 구간을 표현할 때 [a,b) 방식이 가장 좋다

A) 	2 ≤ i < 13
B) 	1 < i ≤ 12
C) 	2 ≤ i ≤ 12
D) 	1 < i < 13

위의 인덱스 넘버링 중 좋은 방법은 A)와 B) 입니다. 그 이유는 다음 두 가지입니다.

  1. 시작 수와 마지막 수의 차가 집합의 크기와 같다
  2. 두 집합을 붙일 때, 마지막 수와 시작 수가 같아 깔끔하다

A)와 B) 중에는 A)가 더 좋습니다. 그 이유는 다음 두 가지입니다.

  1. (a, b] 컨벤션의 경우 가장 작은 수를 포함하려면 그 수보다 작은 수를 집어넣어야 해서 깔끔하지 않다. ex) 양수를 표현할 경우, 양수보다 작은 값인 0을 집어넣은 0≤x 라는 수식으로 표현해야 함
  2. (a, b] 컨벤션의 경우 가장 작은 수를 포함하려면 공집합을 표현하기 위해서 마지막 수에 가장 작은 수보다도 작은 수를 넣어야 해서 깔끔하지 않다.

다익스트라는 Xeron PARC에서 Mesa라는 프로그래밍 언어를 만든 경험을 이야기하며 이 주장을 뒷받침합니다. 이 언어에는 앞의 A~D와 같은 컨벤션을 지원하는 특별한 문법이 있었는데, 결국 [a, b) 를 제외한 모든 컨벤션은 오류를 유발하는 원인이 되어 결국 사장되었다는 겁니다.


3.2 [a, b) 컨벤션을 쓸 때에는 0부터 시작해야 마지막 수가 N이 되어서 깔끔하다.

다익스트라는 만약 인덱싱이 1부터 시작하면, 범위가 1 ≤ i < N+1 이 되고, 0부터 시작하면 0 ≤ i < N 으로 마지막 수가 깔끔하게 떨어지고, 마지막 수가 집합의 크기랑 같아져서 더 좋다고합니다.

추가로, 그는 이 이런 이유로 0이야말로 가장 '자연스러운 수'이며, 따라서 자연수로 취급해야 한다고 주장합니다.

또, 그는 포트란, 알골, 파스칼 같은 언어는 이러한 디테일을 놓치고 있다고 디스했는데, 이 컨벤션을 지키는 C는 장수 언어로 지금까지 군림하고 있고, 그가 비판한 언어는 전부 사장된 것을 보면 어느 정도 예견에 성공했다고 할 수 있겠습니다.


3.3 비전공자들은 프로그래머의 수 체계를 이해하지 못한다.

다른 교수님들은 컴퓨터 공학과 학생들이 0부터 시작하는 인덱싱을 하는 것을 보고 허세를 부린다고 놀린 모양입니다. 그는 학생을 지지하고, 이 인덱싱 컨벤션이 유용해 그렇게 하는 것이라고 툴툴거렸습니다.


03. 정리

배열의 index는 왜 0부터 시작할까? 🤔

💡 배열이 메모리에 할당되는 방식을 생각하면, index가 0부터 시작하는 것이 주소 계산에 용이하다.
💡 컴퓨터 공학에서 많은 경우에 인덱싱을 0부터 시작하는 이유는 이것이 가장 유용한 방법이기 때문이다.


Reference

https://www.youtube.com/watch?v=_5McFoJ3VsQ&t=684s
https://developerinsider.co/why-does-the-indexing-of-array-start-with-zero-in-c/
https://stackoverflow.com/questions/7320686/why-does-the-indexing-start-with-zero-in-c
https://nanite.tistory.com/56
https://www.cs.utexas.edu/users/EWD/ewd08xx/EWD831.PDF
https://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html

profile
Work Hard, Play Hard 🔥🔥🔥

0개의 댓글