배열

배열의 1000번째 요소를 첫 요소만큼 빨리 찾는 까닭은?

배열 타입

같은 타입을 줄지어 놓습니다

배열(array)은 같은 타입의 요소를 모아 놓은 것입니다. 요소마다 이름이 있지 않고, 첫 요소에서 몇 번째인지로 가리킵니다. 그 번호가 첨자(subscript)입니다.

값은 예시입니다. 첨자를 인덱스(index)라고도 합니다. 그림은 0부터 셉니다.

배열의 구현

주소는 계산 한 번으로 나옵니다

요소의 크기가 모두 같아서, 첫 요소의 주소(시작 주소)에 (첨자 − 첫 첨자) × 요소 크기를 더하면 그 요소의 주소가 됩니다. 몇 번째든 계산은 한 번입니다. 첨자를 주소로 바꾸는 이 계산이 접근 함수(access function)입니다.

주소는 메모리 칸의 위치를 나타내는 번호입니다. 시작 주소 100과 요소 크기 4는 예시 값입니다.

첨자 범위 검사

범위 밖 첨자는 남의 칸을 가리킵니다

주소 계산은 첨자가 범위를 벗어나도 그대로 됩니다. 나오는 주소는 배열 밖의 칸입니다. 그래서 언어를 설계할 때 첨자가 범위 안인지 검사할지를 정해야 합니다.

예시입니다. 첨자로 어떤 타입을 허용할지, 배열의 한 부분을 가리키는 슬라이스(slice)를 둘지도 설계할 때 정합니다.

첨자 바인딩과 배열의 종류

메모리를 언제 받느냐

정적 배열은 첨자 범위도 메모리도 실행 전에 정해집니다. 실행 중에 메모리를 할당하지 않아 빠릅니다. 고정 스택 동적 배열은 첨자 범위는 실행 전에 정해지지만, 메모리는 선언문이 실행될 때 할당합니다. 쓰는 동안만 자리를 차지해 공간을 아낍니다.

스택은 4강에서 본, 함수가 불리면 쌓이고 끝나면 걷히는 칸입니다. 할당은 쓸 칸을 받는 일, 바인딩은 속성이 정해지는 일입니다.

컴파일 시점 디스크립터

컴파일러가 적어 두는 배열의 명세

변수의 속성을 모아 둔 정보를 디스크립터(descriptor)라고 합니다. 1차원 배열의 디스크립터에는 요소 타입, 인덱스 타입, 인덱스 하한과 상한, 시작 주소가 들어갑니다. 컴파일러는 이것으로 주소를 계산합니다.

앞 카드의 예시 값을 이어 씁니다. k는 첨자이고, 하한은 가장 작은 첨자, 상한은 가장 큰 첨자입니다.

다음 편

칸이 한 줄이 아니라 표라면?

4편표는 메모리에 어떻게 놓일까? 5강 목록