Table of contents
배열은 임의 접근과 높은 참조 지역성으로 개별 요소에 대한 가장 빠른 접근이 가능한 자료 구조입니다. 이는 메모리상에서 각 요소를 연속적으로 저장하기 때문입니다.
배열의 본질
배열은 실질적으로 순서를 유지하는 메모리 블록 집합의 추상화(집합으로 보는 것도 일종의 추상화)입니다. 이 집합 내의 모든 메모리 블록은 같은 크기(요소 혹은 참조의 크기)를 차지합니다. 이는 간격이 일정하다는 의미와 같겠지요? 이러한 특징이 배열의 알파이자 오메가인 임의 접근을 가능케 합니다.
예를 들어보겠습니다. 0번지부터 임의의 크기만큼을 배열로 지정했다고 합시다. 그리고 각 요소의 크기는 8로 가정합니다. 첫 번째(0번 인덱스) 요소는 0번지부터 7번지까지 점유하고 있을 것입니다. 그렇다면 5번째(4번 인덱스) 요소는 어디부터 어디까지 점유하고 있을까요? 32번지부터 39번지까지 점유하고 있을 것입니다.
const array = [ ... ]; // 0번지에 위치하며 요소 별 간격은 8
array[0] // (0 * 8) = 0 이고 간격은 8 이므로, 0번지부터 7번지까지 점유
array[4] // (4 * 8) = 32 이고 간격은 8 이므로, 32번지부터 39번지까지 점유
JavaScript의 배열
좋습니다. 이제 우리는 배열이 무엇인지 알게 되었습니다. 바로 다음 단계인 배열 연산의 구현으로 진행하면 될 것 같습니다. 이를 위해서는 언어상 배열 문법(혹은 그에 준하는 메모리 조작)을 지원해야 할 것입니다. 그런데 JavaScript의 배열은 무엇일까요? Array
? 당장 배열의 임의 접근에 관해 설명할 때 Array
를 사용했는데요. 흠, 글쎄요. 확실히 자료형으로서 그렇다고 부를 수 있겠군요. 하지만 자료 구조 측면에서는 조금 다릅니다.
자료형 vs 자료 구조
자료형의 관심사는 '무엇을'에 있습니다. 자료형에는 여러 연산이 정의되어 있습니다. 사용자의 요청에 따라 적절한 처리를 하며, 사용자는 사전에 이것이 무엇을 의미하는지 알고 있습니다. 하지만 세부적으로 '어떻게' 처리하는지는 공개하지 않으며, 그것에 의미를 두지 않습니다. 다른 자료형이나 자료 구조에 의해 구현됩니다.
자료 구조의 관심사는 주로 '어떻게'에 있습니다. 마찬가지로 연산에 대해 '무엇을' 하는지 사용자가 사전에 알고 있습니다. 하지만 이것이 주요 관심사는 아니며, 중요한 것은 보이지 않는 세부적인 부분에 있습니다. 효율성이나 성능에 방점을 찍으며, 사용자 또한 이에 대한 기대를 합니다. 다른 자료 구조나 자료형의 기반 역할을 합니다.
따라서 Array
는 배열임에 틀림이 없지만 배열에 의해 구현되지 않았을 수 있습니다. 실제로도 그렇다고 알려져 있으며, 이는 보다 범용적인 활용도를 염두에 두었기 때문일 것입니다.
결론은?
조금 어려운 이야기가 되었을지도 모르겠습니다. 걱정하지 마세요. 결론만 따지자면 Array
를 활용하여 배열의 연산을 구현해 보는 데 전혀 무리가 없습니다. 자료 구조와 자료형, 둘은 분명 다르지만, 우리의 필요 관점에서 보면 둘의 차이는 무시할 수 있거든요. 이 경우에서 Array
는 배열 자료 구조의 연산을 모두 포함하면서 여러 연산을 추가로 지원할 뿐입니다. 따라서 자체적으로 제약을 추가하면 동일한 것으로 볼 수 있습니다.
내용은 다음 편에서 이어집니다. 읽어주셔서 감사합니다!
묻고 답하기
개인적인 판단에 의해 적절하다고 여겨지는 경우, 모두가 볼 수 있도록 이곳에 문답이 추가됩니다. 그렇지 않더라도 질문에 대한 답변은 별도로 이루어집니다.