인덱스의 값이 0으로 시작하는 이유

·2022년 3월 15일
1

컴퓨터개론

목록 보기
1/14

다양한 프로그래밍 언어에서 인덱스값의 시작은 0인 경우를 볼 수 있다.
그리고 강의를 듣다보면 그냥 0부터 시작이다! 이해하려고 하지말고 외우는게 답이다! 라는 말을 많이 해서
도대체 왜 그런가?에 대한 궁금증이 있었고, 그것을 알아보려고 좀 살펴봤다.

이러한 것에는 아예 관습이 되어버렸는지 전문용어(?) 또한 존재하는데
Half-open interval
인덱스는 시작 수는 포함하며 마지막 수는 제외한다.
Zero-based numbering
첫 번째 인덱스는 0부터 시작한다.

라는 두 가지로 구성을 한다고 이야기를 한다.


이것을 알아가는 제일 빠른 방법은 컴퓨터와 메모리의 관계를 알아보고,
그 메모리의 위치를 찍어주는 C언어의 포인터를 알아보면 된다.
아 내가 이거때문에 프로그래밍 포기했는데 결국 되돌아가네

내가 알고 싶은 것들이 잘 적혀있는 블로그가 있어서 링크를 걸어놓고 내용을 인용한다.
[C]Chap.11.1 - 메모리와 포인터(1)

블로그에는 이러한 말이 적혀있다.
변수의 본질은 메모리이며 모든 메모리는 자신의 위치를 식별하기 위한 근거로 고유번호(일련번호)를 갖는데, 이 번호를 메모리 주소라 한다.


Zero-based numbering의 설명

일반적인 경우 메모리의 주소당 1바이트의 용량을 할당 받고 있고 1바이트의 경우에는 8bit로 구성이 되어있다.
그리고 컴퓨터는 이진법을 사용하기 때문에 기본이 00000000 고 거기서 변화를 하면서 값을 주는데
0 = 00000000으로 0으로 시작을 하기 때문에 첫번째 인덱스는 0으로 시작을 하게 된다.

라고 나는 생각을 하고 있다.

그런데 형의 이야기로는 배열의 시작 지점은 0으로 시작하는 것은 관습과도 같은 것이라면서
숫자에 할당하면 다 상대적으로 사용하는거라 언어마다 다르고, C언어만큼 오래된 수학/시뮬레이션(과학) 등을 다룰때 사용하는 Fortran라는 언어가 있는데 이것은 인덱스가 1로 시작을 한다고 이야기를 해줬다.

결과적으로 배열을 선언을 할 경우, 그 자리가 시작지점이 된다라는 규칙에 따라서 그 자리는 인덱스 0번이 되며
그 이후로 진행한다고 생각하면 된다고 알려줬다.
아래와 같음
arr[0] = *arr = 0x13
일 경우에는
arr[1] = *arr+1 = 0x14
arr[2] = *arr+2 = 0x15

더욱 자세한 것은 운영체제를 공부하면 된다고.......

ps. *는 포인터를 의미하고 0x10같은 것은 주소를 의미한다.


Half-open interval의 설명

그러고 시작 수는 0으로 시작하지만, 마지막 수가 제외가 되는 것에 대한 설명은 없는데
1byte가 8bit일 경우에는 2^8이라서 256가 나오는데
경우의 수가 256지만, 0부터 시작을 하기에 최대 수가 255가 되어서
마지막 수가 제외되는 것을 알 수 있다.


지금 찾고 있는 인덱스 또한 결국은 메모리에 공간을 할당하기에 0으로 시작한다는 뜻과 동일하다.

왜 그냥 외우라고만 하고 설명을 안해줄까 라는 고민도 함께 가지고 있었는데,
이 블로그에 그 답 또한 같이 있었다.

C언어와 같은 low-level의 언어에서는 주소로 메모리를 식별하지만,
지금 공부하고 있는 Javascpript와 같은 high-level언어에서는 주소값이 아닌 이름으로 식별한다.

라고 서술이 되어있는데, 아마 컴퓨터의 구조에 관한 이해가 모자를 경우에는
메모리의 주소값으로 식별하는 저런 구조는 탈주를 불러일으킬 수 있으니
언어를 개발하는 사람들 입장에서 배제한게 아닐까 라는 생각이 든다.

많은 문서에서 포인터는 컴퓨터의 구조를 알고 있어야 이해할 수 있는데 C언어는 보통 컴공 1학년 전공과목이고 아는 것도 없는데 배우니까 다 탈주하려고 한다고 서술되어있더라

물론 최근 들어서는 메모리의 주소값으로 식별하는 것이 아니라 프로그래밍 언어에서 다 처리를 해서
이런것을 잘 몰라도 문제가 없다고는 하지만 무언가가 존재한다고 하면,
그것의 존재 이유는 분명 있을 것이기에 찾아보는 것 또한 재미라고 생각한다.


나는 결국 결과론 적으로 메모리 값은 0부터 시작을 하고, 끝자리 수는 제외한다 라는 것에 대한 설명을 한 것인데
조금 더 원론적인 이야기를 하는 블로그가 있어서 아래 링크를 달아놓겠다.
나는 봐도 아직은 이해가 되지 않는 것 같아서 시간이 날 때 이해를 해봐야겠다.
0부터 시작하는 이유와 마지막 수를 인덱스로 포함하지 않는 이유

profile
물류 서비스 Backend Software Developer

0개의 댓글