javascript에서는 array
python에서는 list
array보다 list가 더 많이 사용되고
큰 차이가 없으므로 list를 사용해도 무방하다
python에서는 list가 array라고 보면 된다.
하지만, Array와 list는 다르다.
#무엇이 다른가?
기능적으로 거의 동일하지만, 메모리 효율 면에서
array가 유리하다. 다만 사용하기에는 list가 편리하다.
*python에서 array를 사용하려면 import array모듈을 import해서 사용해야하기 때문.
array의 가장 큰 특징은 순차적(ordered)으로 데이터를 저장한다는 것이다.
자료구조에 저장되는 데이터는 일반적으로 요소(element라고 한다.)
array는 주로 서로 연결된 데이터들을 순차적으로 저장할 때 사용한다.
삽입(insertion) 순서대로 저장된다... (즉, 새로 삽입되는 요소는 array의 꼬리가 된다)_.
이미 생성된 리스트도 수정가능하다.
동일한 값도 여러번 삽입가능하다.
Multi-dimensional Array(다중차원 배열)
Array의 요소가 array가 될 수 있다.
Array의 요소가 array가 될 수 있습니다. 이러한 array를 다중차원(multi-dimensional) array라고 합니다. 일반적으로 2D (2차원) array가 많이 사용됩니다.
array의 특징은 수차적으로 젖아한다는 것임. 이렇다 보니 순서대로 번호를 부여할 수가 있다.
이 번호를 index라고 한다.
index는 0부터 시작되는데, 마이너스(-)부호를 가질 수도 있다.
<마이너스 index는 맨 마지막 요소 부터 시작합니다. 예를 들어, -1 은 맨 마지막 요소입니다.>
메모리 상에서 물리적으로 데이터가 순차적으로 저장되기 때문이다.
데이터에 순서가 있기 때문에
1) index가 존재하며
:0부터 시작하는 index
2) Indexing
: Index를 사용해 특정 요소를 array(list)로 부터 읽어 들이는 것이 가능하고
3) Slicing
: 요소의 특정 부분,
즉 n번째 index부터 m번째 index까지 따로 분리해 조작하는 것이 가능합니다.
Array는 메모리의 실제 주소도 순차적으로 되어있습니다.
중간의 특정 요소를 삭제해야 하는 경우를 가정해보겠습니다.
순차적으로 담겨있는 데이터 중 특정 위치에 있는 중간의 요소가 삭제 되는 경우에,
항상 메모리가 순차적으로 이어져있어야 하기 때문에, 삭제된 요소로 부터 뒤에 있는 모든 요소들을 앞으로 한칸씩 이동시켜주어야 합니다.
이뜻은 배열에서 요소를 삭제하는 것은 다른 자료 구조에 비해 느릴 수 있다는 뜻입니다.
요소를 삭제하는 과정이 코드 상에서는 한 줄 이지만 실제 메모리 상에서 이루어지는 작업(operation)은 훨씬 커집니다.(expensive operation)
중간에 요소가 추가 되는 경우도 마찬가지 입니다. 특정 위치에 새롭게 요소가 추가되는 경우에는 그 뒤의 요소들이 하나씩 밀리게 됩니다.
그렇기 때문에 Array 는 정보가 자주 삭제 되거나 추가되는 데이터를 담기에는 적절치 않습니다.
Resizing 이란, 말 그대로 사이즈를 다시 조정한다는 뜻입니다.
배열은 메모리가 순차적으로 채워지기 때문에 배열이 처음 생성될 때 어느 정도 메모리를 미리 할당합니다.
이를 전문 용어로 pre-allocation 이라고 합니다.
메모리를 pre-allocation 함으로써 새로 추가되는 요소들도 순차적으로 메모리에 저장될 수 있습니다.
하지만 요소들이 처음 할당한 메모리 이상으로 많아진다면 resizing이 필요합니다.
즉, 메모리를 더 할당해야 합니다.
그리고 추가적으로 할당된 메모리 또한 순차적이어야 합니다.
그럼으로 배열의 resizing은 상대적으로 오래걸리는 operation 입니다.
100개의 메모리 공간 다 차서 100개를 추가해야 되는 경우
200개 크기의 메모리를 생성 후 > 기존 100개를 복사하고 > 그 다음 101번 부터 데이터가 순차적으로 추가됩니다. OMG🤢
그렇기 때문에 Array 는 사이즈 예측이 잘 안 되는 데이터를 다루기에는 적절치 않습니다.
일반적으로 대부분의 언어에서는 배열의 메모리 pre-allocation과 resizing을 자동으로 실행합니다. 하지만 이러한 점을 알고 있어야 사이즈가 급격하게 자주 늘어날 확률이 있는 데이터는 array 말고 더 적합한 자료구조를 선택해야 한다는 것을 알 수 있습니다.