[Data Structure] Array

mokyoungg·2020년 5월 11일
0
post-custom-banner

내용의 모든 출처는 부트캠프 위코드입니다.
https://wecode.co.kr/


1. 정의

가장 기초적이고 단순하면서도 가장 자주 사용되는 자료 구조.

2. 특징

순차적으로 데이터를 저장하는 자료 구조

  • 순차적.순차적.순차적. (데이터를 입력하는 순서대로 기억함)
  • 배열은 주로 서로 연결된 데이터들을 순차적으로 저장할 때 사용
  • 순서가 상관없더라도 서로 연결된 데이터들을 저장할 때 일반적으로 사용... >> 연결된 데이터.
  • 그래서 배열이 가장 자주 사용되는 자료 구조 중 하나

자료구조에 저장하는 데이터는 일반적으로 요소라고 함

기타특징

  • 삽입되는 순서대로 저장(새로 삽입되면 어레이의 새로운 꼬리)
  • 이미 생성된 어레이 수정 가능
  • 동일한 값도 여러번 삽입 가능
  • Multi-dimentional Array 다중차원 배열 : 어레이의 요소가 어레이가 될 수 있음

3. 내부 구조

  • 순차적으로 데이터를 저장하기 때문에 번호를 지정할 수 있음(인덱스)
  • 인덱스는 0부터 시작하며, 마이너스 요소도 가능(-1은 맨 마지막 요소)

순차적 데이터 저장의 이유

실제 메모리 상에서, 즉 물리적으로 데이터가 순차적으로 저장되기 때문
(데이터에 순서가 있기 때문에...)
인덱스가 존재하며 인덱스를 통해 특정 요소를 어레이에서 읽어들일 수 있고,
요소의 특정 부분, 즉 n번째 인덱스부터 m번째 인덱스까지 분리하여 조작이 가능하다(slicing)

4. 단점

Removing or Adding Elements

순차적으로 담겨있는 데이터 중 특정 위치에 있는 중간의 요소가 삭제되는 경우에,
항상 메모리가 순차적으로 있어야해서 삭제 요소의 뒤 요소들은 앞으로 한칸씩 이동해야한다.
이는 배열에서 요소를 삭제하는 것이 다른 자료 구조에 비해 느릴 수 있다는 뜻이다
중간에 요소가 추가되는 경우도 마찬가지. (추가되는 요소의 뒷 요소들이 하나씩 밀리게됨)

따라서, Array는 정보가 자주 삭제되거나 추가되는 데이터를 담기에는 적절치 않다.

느리기 떄문. 수정에 따라 곁(뒤)에 있는 데이터들이 이동해야 하며, 한줄의 코드지만
실제 메모리 상에서 이루어지는 작업은 커짐(복잡해짐? 이라기 보단 일을 한 번 더 해야함)

Array Resizing

Resizing이란, 사이즈를 다시 조정한다는 뜻.
배열은 메모리가 순차적으로 채워지기 때문에 배열이 처음 생성될 때 어느 정도 메모리를 미리 할당한다. (이를 전문 용어로, pre-allocation이라고 함)
메모리를 pre-allocaiont 함으로써 새로 추가되는 요소들도 순차적으로 메모리에 저장될 수 있다.
하지만 요소들이 처음 할당한 메모리 이상으로 많아진다면 resizing이 필요함
(즉, 메모리를 더 할당해야 함)
그리고 추가적으로 할당된 메모리 또한 순차적이어야한다
그럼으로 배열의 resizing은 상대적으로 오래 걸리는 operation이다.

100개의 메모리 공간이 다 차서 100개를 추가해야 되는경우, 200개 크기의 메모리를 생성,
기존 100개를 복사하고 그 다음 101번부터 데이터가 순차적으로 추가된다.(단순하다)

따라서 어레이는 사이즈 예측이 잘 안 되는 데이터를 다루기에는 적절치 않다.

사이즈가 급격하게 자주 늘어날 확률이 있는 데이터는 array 말고 더 적합한 자료구조를 선택해야한다는 것

5. 사용처

  • 순차적인 데이터를 저장할 때 : 주식 가격(값보다는 순서가 중요)
  • 다차원 데이터를 다룰 때 : multi-dimenstional Array
  • 어떠한 특정 요소를 빠르게 읽어야 할때 > 인덱스를 통해 곧바로 읽을 수 있음
  • 데이터의 사이즈가 급변하게 자주 변하지 않을 때
  • 요소가 자주 삭제되거나 추가되지 않을 때
profile
생경하다.
post-custom-banner

0개의 댓글