배열은 모든 프로그래밍 언어에서 기본적으로 제공하는 자료구조이다.
자바스크립트에서의 배열은 일반적인 배열과는 다르다.
배열의 이해를 위해서는 배열이 메모리에서 어떤 모습을 하고 있는지 알아야한다.
일반적으로 프로그래밍 언어에서는 배열을 선언할 때 배열의 크기를 알려준다.
int arr[10] = {1,2,3,4,5};
이렇게 배열을 선언했다면 운영체제는 메모리에서
숫자 10개가 들어갈 수 있는 연속된 빈공간을 찾아서 순서대로 1,2,3,4,5를 할당한다.
할당하지 않은 부분은 의미없는 쓰레기 값이 저장되어있다.그리고 운영체제는 배열의 시작 주소, 즉 숙자 1이 들어간 주소만 기언한다.
프로그래머가 배열의 세 번째 원소에 접근하고 싶다면
arr[2]와 같이 인덱스로 한번에 접근한다.운영체제는 배열의 시작 주소를 알고 있기 때문에
배열의 시작 주소부터 두 번째 떨어진 주소에서 데이터를 가져온다.
배열의 인덱스 참조는 길이에 상관없이 한 번에 가져오기 때문에
O(1)의 성능을 가진다.때문에 배열은 읽기,쓰기와 같은 참조에서 좋은 성능을 보인다.
배열의 참조 성능은 좋지만, 데이터 삽입, 삭제 성능은 좋지 않다.
앞서 배열은 배열의 크기만큼 메모리에 연속된 공간을 할당한다고 했다.
만약 배열의 10의 크기만큼 메모리에 연속된 공간을 할당하면
그림과 같이 배열이 할당된 공간의 끝에는 다른 중요한 데이터가 있어
더 확장할 수 없는 상황이다.
여기서 배열의 크기를 15로 확장하면 운영체제는 크기가 15인 연속된 공간을
다시 찾아서 할당한다.
또한 기존의 10의 크기를 지닌 배열을 전부 복사하여 새로 할당한 공간에
복사까지 해줘야한다.
그렇다면 여기서 이런 일이 발생하지 않도록
배열의 크기를 int arr[1000]
과 같이 미리 넉넉하게 만들면 어떻게 될까?
이렇게 하면 일시적으로 해결할 수 있는 듯 보이나
여기서 사용자가 1000보다 더 큰 배열을 원한다면?
그렇다면 int arr[99999];
처럼 무자비하게 넉넉하게 만드는 방법을 생각할 수 도있다.
이는 사용하는 공간이 생겨 많은 낭비가 발생한다.
이처럼 배열은 데이터를 추가, 제거 하려면 내부적으로 필요한 단계가 많이 들기 때문에
내부적으로 성능이 좋지 않다.
자바스크립트 배열은 처음에 크기를 지정하지 않는다.
push, pop 함수로 데이터 추가, 제거가 가능하다.
자바스크립트에서 배열은 상황에 따라서 연속적, 불연속적으로 메모리를 할당한다.
자바스크립트에서 배열은 대부분 불연속적으로 메모리를 할당하여 이를 내부적으로 연결해
사용자에게는 배열인 것처럼 보이게 한다.
이러한 이유로 자바스크립트의 배열은 정통적인 프로그래밍 언어의 배열과는 다르지만,
자료구조의 기능적인 부분으로만 봤을 때는 동일하기 때문에 배열이라고 부를 수 있다.