💻 IT/Data Structure (자료구조)

동적 배열(dynamic array) vs 정적 배열(static array)

Nyan cat 2022. 10. 4. 16:45

📌 1. 배열이란?

배열은 한개의 데이터가 아닌 여러 개의 데이터를 담기 위한 자료구조이다. 그런데 C언어의 배열과 파이썬의 리스트는 다르다.

나는 개인적으로 파이썬을 입문 언어로 맨 처음에 배웠는데 자료들의 크기, 타입 상관없이 원하는 대로 마구 담을 수 있었던 파이썬의 친절한 리스트와 달리 C언어랑 자바의 배열은 냉정하고 차갑기만 했다. 자료 구조를 조금 더 이해하고 나서 동적 배열과 정적 배열의 차이 때문에 그렇다는 것을 알게 되었다.

일반적으로 배열이라고 하면 정적 배열을 의미한다. 그래서 나처럼 파이썬으로 입문해서 친절한 리스트로만 배열에 익숙하신 분이라면 이 차이를 알고 정적 배열도 이해하는 것이 중요하다고 생각한다.

 

C언어의 배열 (정적 배열)

  • 크기가 고정돼 있다연속적인 칸을 예약하여 데이터를 메모리 공간에 담는다
  • 같은 타입의 데이터만 담을 수 있다

파이썬의 리스트 (동적 배열)

  • 크기가 고정되어 있지 않다 값들이 연속적인 곳에 있을 수도 있고 아닐 수도 있다
  • 데이터가 아닌 데이터를 가리키는 레퍼런스를 담는다
  • 자료들의 크기가 큰 상관이 없다
  • 서로 다른 타입의 데이터도 담을 수 있다

이미지 출처 : wikiwand.com/ko/동적_배열

📌 2. 동적 배열(dynamic array) vs 정적 배열(static array)

  • 정적 배열 : 크기 고정 (요소 수 제한)
  • 동적 배열 : 크기 변함 (요소 계속 추가 가능)

 

정적 배열(static array)

정적배열의 경우 이미 만들어진 배열이 꽉 차면 새로운 값을 넣을 수 없다. 5개의 정수 값이 있는 정적 배열에 새로운 정수를 하나 더 추가하고 싶은 경우 6개의 정수를 담을 수 있는 새로운 메모리 공간을 확보하고 기존값 5개를 복사한 후 마지막 공간에 새로운 값을 넣어야 한다.

 

왜 이렇게 불편하고 비효율적인 방법으로 해야할까?

정적 배열을 정의하면 데이터 타입과 갯수에 따라 필요한 공간의 크기가 정해진다. 이 공간은 쭉 연결된 공간이어야 한다.

이 때 새로운 값을 추가하는 경우 바로 다음 공간에 추가해야 하는데 이 때 그 다음 공간이 비어있는지 알 수 없다. 그래서 함부로 사용하기엔 위험성이 있다. 그렇다고 필요 이상으로 지나치게 여유로운 배열을 정의하면 메모리 공간에 낭비가 심해진다.

그래서 결론적으로는 아예 새로운 메모리 공간에 기존값을 모두 복사한 후 다음 공간에 새로운 값을 추가하는 것이다. 

 

동적 배열 (dynamic array)

동적배열도 사실은 엄밀히 따지면 정적배열이다.  정적배열로 만들어진 자료 구조정적 배열의 크기를 상황에 맞게 조절해서 동적으로 사용한다. 배열에 새로운 값을 추가하려고 할 때

  1. 기존 배열보다 두 배 큰 배열을 만든다. (꼭 두 배일 필요는 없고 정하기 나름)
  2. 기존의 데이터를 넣고 새로운 데이터를 뒤에 추가한다

개발자 입장에서는 배열의 크기를 고려하지 않아도 되서 편하다.

 

📕 파이썬의 리스트 (동적 배열)

파이썬 리스트는 동적 배열이다. 그래서 내부적으로 얼마나 큰 배열이 있는지 몰라도 값을 마음대로 추가할 수 있다.

동적 배열이기 때문에 상황에 맞게 배열 크기가 조절된다. 파이썬 뿐만 아니라 동적 배열을 자료형으로 제공하는 대부분의 언어들은 실제 사용하는 배열의 크기와 상관없이 내부적으로 배열로 지정한 공간을 사용할 수 있게 처리를 해준다.

반응형