if __name__ == "__main__":
arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for i in range(10):
print(i, arr[i])
위 코드는 간단하게 arr이라는 배열을 선언하고 for 문을 사용하여 값을 넣은 후에 출력하도록 하는 코드입니다.
위 코드 출력 값을 보면
왼쪽은 index가 출력이 되고 오른쪽에는 저장되어 있는 값이 출력이 됩니다.
프로그래밍언어를 처음 배우면서 어려웠던 부분 중 하나가 이 부분이었습니다. 왜 index는 0부터 시작일까?
오늘은 이 이유에 대해서 같이 알아보도록 합시다!
왜 0부터?
index가 0부터 시작하는 이유는 컴퓨터 메모리 구조와 관련이 있습니다. 컴퓨터의 메모리는 바이트라는 단위로 이루어져 있습니다. 그리고 각각의 바이트에는 주소가 할당이 되어있습니다.
예를 들어서 위 예시 코드는 정수형 배열을 선언을 해줬습니다. 그럼 한칸의 크기는 4바이트를 차지합니다.
if __name__ == "__main__":
arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for i in range(10):
print(f"Index: {i}, Value: {arr[i]}, Address: {id(arr[i])}")
모든 배열의 칸에는 이렇게 주소가 존재합니다. 그럼 여기서 크기가 4씩이니까 주소의 차이도 4만큼 나야하는 거 아닌가?? 라는 의문을 갖게 되었습니다.
제가 예시 코드를 python으로 작성하여 그렇습니다. python에서는 리스트의 각 요소가 객체로 취급되고 이 객체들은 메모리 내에서 연속적으로 위치하지 않을 수 있습니다.
#include <stdio.h>
int main() {
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for (int i = 0; i < 10; i++) {
printf("Index: %d, Value: %d, Address: %p\n", i, arr[i], (void*)&arr[i]);
}
return 0;
}
C언어로 돌려봤을 때 각 주소의 차이가 4만큼 나는 사실을 확인할 수 있었습니다.
배열의 첫 번째 요소를 메모리에서 찾기 위해서는 배열의 시작 주소에 0을 더해야 알 수 있습니다. 이렇게 되면 첫 번째 주소 = 배열의 시작 주소가 될 수 있습니다.
추가적으로 다익스트라의 해설이 있습니다. 다익스트라 교수가 왜 0부터 시작하고 마지막 수는 포함하지 않아야 하는 이유를 적은 노트가 있습니다.
다익스트라 노트 : https://www.cs.utexas.edu/users/EWD/ewd08xx/EWD831.PDF
알고리즘을 공부하면 처음 접했던 분이신데 이분이 이런 정리를 하셨다는게 새로웠습니다.
정리
- 배열이 메모리에 할당되는 방식을 고려했을 때 index가 0부터 시작해야 처음 주소와 그 이후 주소를 파악하기 쉽다.
- 초기 언어들이 0으로 시작하는 인덱스를 사용하여 그 이후 언어들도 이 체계를 따르고 있다.
Reference
https://www.youtube.com/watch?v=_5McFoJ3VsQ&t=684s
'CS' 카테고리의 다른 글
[CS공부] 3-way-handshake & 4-way-handshake에 대해서 (1) | 2024.01.04 |
---|