이쁜왕자 만쉐~~
배열의 인덱스는 왜 i 일까요? 본문
C 언어를 비롯하여 각종 C-like 언어들은 대부분 배열 인덱스로 i 를 씁니다.
int i;
int a[10];
for (i=0;i<10;i++)
{
a[i] = i * i;
}
이걸 iterator 의 i 라느니, index 의 i 라느니 하는 다양한 이야기가 있지만, 정답을 먼저 말하면 integer 의 i 입니다.
이를 이해하기 위해서는 먼 고대의 언어인 포트란(FORTRAN) 까지 올라가야 합니다.
현대의 언어는 C 언어와 마찬가지로 사용하기 위해서는 '변수 타입'을 선언해야 합니다. 예를 들어 C 언어에는 char, int, float, double 같은 여러 변수 타입이 존재합니다.
그런데, 초기의 FORTRAN 언어에는 변수 타입이 딱 2가지만 존재했습니다. FIXED-POINT (정수형, 후에 INTEGER 로 바뀜) 과 REAL (실수형) 밖에 없었죠. 별도의 선언은 없었으며, 변수명이 어떻게 시작하는지로 구분했습니다.
I, J, K, L, M, N 으로 시작되는 변수명은 정수형(INTEGER)이다. |
그 외의 변수명은 실수형(REAL) 이다. |
배열의 인덱스는 당연히 정수형이어야 하기에, 포트란 프로그래머는 당연히 루프 인덱스나, 배열 인덱스를 I, J, K 로 썼습니다. 이게 계속 다른 언어에까지 이어져, 현대의 언어까지 내려오는 전통이 되었습니다.
이를 암묵적 선언(implicit declaration) 이라고 부릅니다. 참고로, C 언어에도 이 표현이 나오는데, 함수를 선언하지 않고 사용하면, 자동으로 int 를 리턴 타입으로 가정합니다.
참고로, INTEGER 의 I 인 것은 분명한데, 왜 N 까지냐는 확인이 안됩니다. INteger 라서 그렇다는 소문은 들어 봤네요. 그래서, 외우기는 쉽습니다.
하지만, 변수 타입이 없는 언어는 여러 문제점을 유발했기에 포트란도 새로운 스펙이 나오며 변수 타입이 추가됩니다. INTEGER, REAL, DOUBLE PRECISION, COMPLEX, LOGICAL 같은 타입이 새로 추가되었고, 변수를 사용하기 위해서는 타입을 선언한 뒤 사용해야 했습니다. 즉, I 라는 변수를 사용하기 위해서는 INTEGER I 라고 선언하고, I 의 타입이 정수형이라고 미리 선언해 두어야 하죠. 그런데, 이렇게 하자 기존 코드들 다 뜯어 고치라는 거냐? 호환성은 밥말아 먹었냐?며 기존 프로그래머들이 반항합니다. 그래서, 기존의 암묵적 선언은 그대로 남아 있게 됩니다.
그리고 포트란 언어에는 다음과 같은 유머가 있습니다.
GOD is REAL |