메모리에 데이터를 저장하는 영역은 세곳이에요.
동적 배열 개념을 이해하려면 `스택`과 `힙`의 차이를 이해 해야해요.
스택
- 실제 스택프레임(파이썬의 스택 프레임과 개념은 같지만 실제 할당되는 공간은 다름)이 쌓이는 메모리 공간
힙
- 변수의 생성 시기와 소멸 시기를 프로그래머가 결정 할 수 있는 메모리가 동적으로 할당 되는 영역
스택 프레임 vs 힙
- 스택 프레임을 할당하려면 미리 할당 될 스택프레임의 크기를 알고 있어야 합니다. 그래서 스택 영역에서 배열을 만들기 위해서는 반드시 고정된 크기로 만들어야 했어요. 프로그램에 사용할 데이터 크기를 명확하게 알고 있다면 다행이지만, 크기가 가변적으로 변할 수 있느 ㄴ상활이라면 스택에 고정 크기를 가지는 배열을 만들어 쓰기에 어려움이 많습니다.
프로그래머가 원하는 만큼 크기를 할당받을 수 있기에 일단 필요한 만큼 할당받아 데이터를 저장하다가, 많은 메모리가 필요한 순간이 오면 더 큰 공간을 확보하여 이전 배열 요소를 모두 복사한 후 새로운 데이터를 삽입할 수 있습니다.
동적배열이란 힙 영역에 저장되는 배열을 의미합니다. 이에 여러 가지 유용한 연산을 추가해서 오늘날의 동적 배열이 완성되었는데요. C++의 Vector, 자바의 ArrayList, 파이썬의 리스트가 동적배열입니다.
ADT
Dynamic Array
Object
- 원소의 순서 있는 유한 집합 Array
Operation
1. Array.is_empty() -> Boolean
: 리스트가 비어 있으면 True or False로 반환
2. Array.add_last(element)
: 리스트의 마지막 원소에 추가
3. Array.insert(index, element)
: 리스트의 인덱스 위치에 element원소 삽입
4. Array[index] - > element
: 인덱싱(indexing), 인덱스에 위치한 원소 반환
1. Array.remove_last() -> element
: 리스트의 마지막 원소를 삭제한 후 반환
1. Array.remove(index) -> element
: 인덱스에 위치한 원소를 삭제하고 반환
# is_empty(): 파이썬에서 빈 리스트는 거짓을 의미합니다. 그러므로 메서드는 따로 없고
# 리스트 자체만으로 is_empty() 연산의 결과를 얻을 수 있습니다.
li = []
li
# []
bool(li)
# False
```python
# add_last(element): append() 메서드가 리스트의 마지막에 원소를 추가하는 연산을 수행합니다
li = [1,2,3,4]
li.append(5)
li
# [1,2,3,4,5]
# insert(index, element) : 리스트의 insert() 메서드가 리스트의 중간에 원소를 추가하는 연산입니다.
li = [1,2,3]
li.insert(1,4)
li
# [1,4,2,3]
#remove_last() : 리스트의 pop() 메서드에 매개변수를 전달하지 않으면 리스트의 마지막 원소를 삭제합니다.
li = [1,2,3,4,5]
li.pop()
# 5
li
# [1,2,3,4]
#remove(index) : 리스트의 pop() 메서드에 매개변수로 인덱스를 전달하면 리스트의 인덱스 위치에 있는 원소를 삭제합니다.
```
'여러가지 > 알고리즘 & 자료구조' 카테고리의 다른 글
[백준] 상수 - 2908번 (0) | 2024.05.30 |
---|---|
[백준] 할리갈리 - 21760번 (0) | 2024.05.30 |
[백준] 단어의 개수 - 1152번 (0) | 2024.05.30 |
스택: 데이터를 차곡차곡 쌓기 (0) | 2021.11.29 |
Differences between Stack and Heap (0) | 2021.11.29 |