List
1. List란?
- 가장 기초적이고 단순하면서도 가장 자주 사용 되는 자료 구조
- JavaScript 에서는 Array
※ List와 Array 참고
- Python 에서는 List 가 Array 라고 생각하고 써도 무방 ( 엄밀히 말하자면 Array 와 List 는 다름 )
- 기능적으로는 거의 동일하지만 메모리 효율면에서는 Array 가 유리함
- Python 에서 Array 를 사용하려면 import Array 모듈을 import 해서 사용
2. 특징
순차적으로 데이터를 저장하는 자료 구조
- 순차적(ordered)으로 데이터를 저장
- 서로 연결된 데이터들을 순차적 으로 저장할때 사용
- 순서가 상관 없더라도 일반적으로 서로 연결된 데이터들을 저장할때 사용
기타 특징
- 삽입(insertion) 순서대로 저장됨 (새로 삽입되는 요소는 마지막 요소가 됨)
- mutable
- 동일한 값도 여러번 삽입 가능
- Multi-dimentional Array (다중차원 배열)
3. 내부 구조
- 순차적으로 번호 지정 가능 ( index )
- Index는 0부터 시작됨
- 맨 마지막 요소 부터 카운팅 가능 ( 이때는 마지막이 -1 )
4. 장점
데이터에 순서가 있기 때문에 가지는 장점
4-1. Indexing
Index를 사용해 특정 요소를 array( list )로 부터 읽어 들이는 것 가능
4-2. Slicing
요소의 특정 부분( n번째 index부터 m번째 index )까지 따로 분리해 조작하는 것 가능
5. 단점
5-1. Removing or Adding Elements
항상 메모리가 순차적으로 이어져있어야 하기 때문에 만약 중간의 특정 요소를 삭제하면 아래와 같이 인덱스 변경됨 (추가하는 경우에도 인덱스에 변경이 생김)
-
중간에 삭제한 경우 : 삭제된 요소로 부터 뒤에 있는 모든 요소들을 앞으로 한칸씩 이동시켜주어야함
-
중간에 추가한 경우 : 그 뒤의 요소들이 하나씩 밀리게 됨
-
배열에서 요소를 삭제/추가 하는 것이 다른 자료 구조에 비해 느릴 수 있음
요약
정보가 자주 삭제 되거나 추가되는 데이터를 담기에는 적절하지 않음
5-2. Resizing
Resizing 이란 사이즈를 다시 조정한다는 뜻
-
pre-allocation : 배열이 처음 생성될 때 어느 정도 메모리를 미리 할당하는 것
-
메모리를 pre-allocation 함으로써 새로 추가되는 요소들도 순차적으로 메모리에 저장될 수 있음
-
요소들이 처음 할당한 메모리 이상으로 많아진다면 resizing이 필요 ( 메모리를 더 할당해야함 )
-
추가적으로 할당된 메모리 또한 순차적이어야 함
-
배열의 resizing은 상대적으로 오래걸리는 operation
예시 ) 10개의 메모리 공간이 다 차서 10개를 추가해야 되는 경우
20개 크기의 메모리를 생성 --> 기존 10개를 복사하고 --> 11번 부터 데이터가 순차적으로 추가됨
아래의 사진 참고
요약
- 사이즈 예측이 잘 안 되는 데이터를 다루기에는 적절하지 않음
- 사이즈가 급격하게 자주 늘어날 확률이 있는 데이터는 다른 적합한 자료 구조를 선택해야함
6. 적절한 사용 예
- 순차열적인 데이터를 저장할 때 ( 값보다는 순서가 중요한 데이터 )
- 다차원 데이터를 다룰 때 ( Multi-dimensional Array )
- 어떠한 특정 요소를 빠르게 읽어야 할 때 ( index를 통해 바로 읽을 수 있기 때문 )
- 데이터의 사이즈가 급변하지 않을 때
- 요소가 자주 삭제 되거나 추가되지 않을 때
Tuple
1. Tuple 이란?
- 순차적으로 저장할 수 있는 순열 자료구조
- immutable
- 2 ~ 3개 정도의 소규모 데이터를 저장할 때 많이 사용
- 함수에서 리턴 값을 한 개 이상 리턴하고 싶을 때 사용
2. 장점
간단한 값을 빨리 표현하고 싶을 때 용이함
3. 단점
데이터가 무슨 의미인지 명확하지 않음
요약
- Tuple은 소규모 데이터를 다루기에 적합
- 단점을 극복하기 위해 Named Tuple 이란 것도 존재
4. 적절한 사용 예
- Array(List)를 쓰기에는 간단한 데이터들을 표현할 때 사용
- Tuple이 Array(List) 보다 더 가볍고 메모리도 적게 사용함