[자료구조] 1. Array (List)

lilyoh·2020년 8월 3일
0

자료구조

목록 보기
3/3

1. 정의

  • 자바스크립트에서는 Array, 파이썬에서는 List
  • Array(List) 는 가장 기초적이고 단순하면서도 가장 자주 사용되는 자료구조이다.

(+) Array 와 List 는 비슷하다. 파이썬에서 Array 를 사용하려면 import Array 모듈을 사용해야 한다. 엄밀히 말하면 Array 와 List 는 다르다. 기능적으로는 거의 동일하지만 메모리 효율 면에서 Array 가 더 유리하다.

2. Array 특징

2-1. 순차적

  • Array 의 가장 큰 특징은 순차적(ordered) 으로 데이터를 저장한다는 점이다.
  • 자료구조에 저장하는 데이터는 일반적으로 요소(element) 라고 한다.
  • Array 는 주로 연결된 데이터들을 순차적으로 저장할 때 사용한다.
  • 순서가 상관 없더라도 서로 연결된 데이터들을 저장할 때 일반적으로 사용한다.

2-2. 그 외

  • 삽입(insert) 순서대로 저장된다. (새로 삽입되는 요소는 array 의 꼬리 요소가 된다.)
  • 이미 생성된 리스트도 수정 가능하다. (mutable)
  • 동일한 값도 여러 번 삽입 가능하다.
  • Multi-dimensional Array (다중 차원 배열)
    : array 의 요소가 array 가 될 수 있다. 이를 다중차원 Array 라고 한다. 일반적으로 2D Array 가 많이 사용된다.

3. Array 내부 구조

  • Array 에서는 요소에 인덱스가 붙는다.
  • index 는 0 부터 시작된다. 마이너스 부호를 가질 수도 있다. 마이너스 인덱스는 맨 마지막 요소부터 시작한다. 마지막 요소의 인덱스는 -1 이다.

3-1. Array 는 왜 순차적으로 데이터가 저장될까?

  • 실제 메모리 상에서 (물리적으로) 데이터가 순차적으로 저장되기 때문이다.
  • 데이터에 순서가 있기 때문에
    1) index 가 존재하며
    : 0 부터 시작하는
    2) indexing
    : index 를 사용해 특정 요소를 array 로부터 읽어 들이는 것이 가능하고
    3) slicing
    : 요소의 특정 부분 즉, n 번째 index 부터 m 번째 index 까지 따로 분리해 조작하는 것이 가능하다.

4. 한계

4-1. Removing or Adding Elements

  • 중간에 특정 요소를 삭제해야 하는 경우를 생각해보자.
  • 항상 메모리가 순차적으로 이어져 있어야 하기 때문에 삭제된 요소로부터 뒤에 있는 모든 요소들을 앞으로 한칸씩 이동시켜줘야 한다.
  • 따라서 배열에서 요소를 삭제하는 것은 속도가 느리다.
  • 코드 상에서는 한 줄이지만, 실제 메모리 상에서 이루어지는 작업은 훨씬 커진다. (expensive operation)
  • 중간에 요소가 추가되는 경우도 마찬가지이다. 특정 위치에 새로운 요소가 추가되면 그 뒤의 요소들이 하나씩 밀리게 된다.
  • 따라서 Array 는 정보가 자주 삭제되거나 추가되는 데이터를 담기에는 적절하지 않다.

4-2. Array Resizing

  • resizing 이란 사이즈를 다시 조정한다는 뜻이다.
  • 배열은 메모리가 순차적으로 채워지기 때문에 처음 생성될 때 어느 정도 메모리를 미리 할당한다.
  • 이를 pre-allocation 이라고 한다.
  • 메모리를 pre-allocation 함으로써 새로 추가되는 요소들도 순차적으로 메모리에 저장될 수 있는 것이다.
  • 하지만 처음 할당한 메모리 이상으로 요소가 많아지면 resizing 이 필요하다.
  • 메모리 할당이 더 필요하다는 것인데, 새로운 메모리도 순차적이어야 한다.
  • 따라서 배열의 resizing 은 상대적으로 오래 걸리는 operation 이다.
  • 예를 들어 100 개의 메모리 공간이 다 차서 100 개를 추가해야 하는 경우를 생각해보자.
  • 200 개 크기의 메모리를 생성한 후 > 기존 100 개를 복사하고 > 그 다음 101 번부터 데이터가 순차적으로 추가된다.
  • 그러므로 Array 는 사이즈 예측이 안되는 데이터를 다룰 때에는 적절하지 않다.
  • 일반적으로 대부분의 언어에서는 배열의 메모리 pre-allocation 과 resizing 을 자동으로 실행한다. 하지만 사이즈가 급격하게 자주 늘어날 확률이 있는 데이터는 array 말고 더 적합한 자료구조를 사용하는 것이 좋다.

5. Array 언제 사용하는 것이 좋을까?

  • 순차열적인 데이터를 저장할 때
    : ex) 주식 가격 등 값보다는 순서가 중요한 데이터
  • 다차원 데이터를 다룰 때
  • 특정한 요소를 빠르게 읽어야 할 때
    : index 를 통해 곧바로 읽을 수 있으므로
  • 데이터의 사이즈가 급변하지 않을 때
  • 요소가 자주 삭제/추가되지 않을 때

    Array를 적용시키면 좋은 예로 주식 차트가 있습니다. 주식 차트에 대한 데이터는 요소가 중간에 새롭게 추가되거나 삭제되는 정보가 아니며, 날짜별로 주식 가격이 차례대로 저장되어야 하는 데이터입니다. 즉, 순서가 굉장히 중요한 데이터 이므로 Array 같이 순서를 보존 해주는 자료구조를 사용하는 것이 좋습니다. 이와 같은 데이터에 Array를 사용하지 않는 경우, 즉 순서가 없는 자료 구조를 사용하는 경우에는 날짜별 주식 가격을 확인하기 어려우며 매번 전체 자료를 읽어 들이고 비교해야 하는 번거로움이 발생합니다.

0개의 댓글