여러가지/알고리즘 & 자료구조

🛩동적 배열이란?

hyeseong-dev 2021. 11. 29. 10:34

메모리에 데이터를 저장하는 영역은 세곳이에요.

동적 배열 개념을 이해하려면 `스택`과 `힙`의 차이를 이해 해야해요. 

 

스택 

 - 실제 스택프레임(파이썬의 스택 프레임과 개념은 같지만 실제 할당되는 공간은 다름)이 쌓이는 메모리 공간

 

 - 변수의 생성 시기와 소멸 시기를 프로그래머가 결정 할 수 있는 메모리가 동적으로 할당 되는 영역 

 

 

스택 프레임  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() 메서드에 매개변수로 인덱스를 전달하면 리스트의 인덱스 위치에 있는 원소를 삭제합니다. 

 

```