배열-리스트-Python리스트

하얀족제비·2021년 8월 7일
0

🤔 배열과 리스트의 차이

평소 Python에서 당연하게 리스트를 사용했던터라

이 부분에 대해 확실하게 한번 짚고 넘어가야 겠다고 생각했다.

🧐 Array

1. 정의

  • 데이터가 많아지면 이 데이터들을 그룹으로 관리할 필요가 생기는데, 그때 사용하는 것이 바로 배열이다.
  • 다수의 데이터를 하나의 배열로 이름지어 선언하여 하나의 큰 그룹으로 관리한다.
  • 인덱스를 통해 배열 내에 있는 값들에 접근할 수 있다.

2. 특징

✨ 인덱스를 갖는다.

배열은 메모리에서 생성될 때 항상 크기가 주어진다.

즉, 배열이 담을 수 있는 아이템들의 개수는 선언한 만큼으로 정해져 있고

컴퓨터는 해당 배열을 위한 공간을 메모리에 할당해준다.

이때, 할당된 메모리 공간은 연속적이라는 특징이 있다.
(각 아이템은 인덱스를 갖는다.)

✨ 배열의 모든 아이템들은 똑같은 사이즈를 갖는다.

배열은 위와 같이 연속된 박스의 나열이다.

모든 아이템들이 서로 옆에 배치되고, 같은 크기를 갖기 때문에 첫번째 아이템의 위치를 알고 있다면, 다른 아이템들의 위치도 계산할 수 있다.

Ex. 첫 아이템의 메모리 위치가 00이고 사이즈가 24바이트 일때,
바로 다음 아이템은 00 + 24 = 24에 위치하게 되는 격이다.
또, 그 다음 아이템은 24 + 24 = 48이며, 이런 식으로 계속 된다.

배열에 위치한 어떠한 아이템의 메모리 위치도 쉽게 계산할 수 있으며
아이템에 인덱스를 할당할 수 있고, 인덱스를 활용하여 쉽고 직접적으로 아이템에 접근할 수 있다.

✨ 배열은 길이를 바꿀 수 없다.

길이를 바꾸기 위해서는 기존의 배열은 그대로 두고

새로운 길이로 배열을 다시 하나 만들고

기존 배열에서 데이터를 복사한 뒤 기존의 배열을 삭제해야한다.

이를 해결하기 위해서 linked list를 활용할 수 있다.

✨ 배열은 요소가 삭제되어도 빈자리(null)가 남는다.

삭제한 데이터를 뒤에 위치한 요소로 체우면 데이터 순서에 따라 빈틈없이 연속적으로 위치하는 List가 된다.

즉, List의 경우 삭제된 데이터의 빈 공간을 채운다는 특징이 있다.

  • 배열
  • 리스트

└ 배열보다 더 메모리를 효율적으로 사용할 수 있다.

🧐 List

1. 정의

  • 배열이 갖고 있는 인덱스라는 장점을 버리고 빈틈없는 데이터의 적재라는 특징을 취한 데이터 구조이다.
  • 리스트의 핵심은 요소들간의 순서이고, 리스트를 다른 말로 시퀀스(sequence)라고 부른다. 즉, 순서가 있는 데이터의 모임이다.
  • 리스트에서 인덱스는 몇 번째 데이터인가 정도의 의미를 갖는다.
    (배열에서 인덱스는 유일무이한 식별자 역할을 한다.)

2. 특징

✨ 아이템의 메모리 주소가 연속적일 수도, 아닐 수도 있다.

하나의 아이템이 다음 아이템을 포인팅하는 Linked List가 있다.
하지만, 각 아이템들은 메모리 상에서 모두 흩어져 있을 수도 있다.

이 경우에는 첫번째 아이템의 주소를 알아도 다음 아이템의 메모리 주소를 간단히 게산할 수 없다는 것을 의미한다.

결국, 리스트는 배열처럼 아이템에 직접 접근하기 위해 인덱스를 사용할 수 없다.

🧐 공통점, 차이점

📗 배열-리스트 공통점

  • 아이템들의 컬렉션이다.
  • 아이템들의 순서가 있다.

📕 차이점

  • 배열은 인덱스를 가지지만 리스트는 그렇지 않다.
  • 인덱스를 갖긴 하지만 단순히 위치 정보를 나타낸다.
  • 리스트는 길이가 가변이지만 배열은 그렇지 않다.

🧐 Python List

그런데,,

위에서는 List에서 인덱스를 가지지 않는다고 하였는데

파이썬은 리스트를 선언하여 인덱스를 활용하여 접근이 가능하다

lst = [1, 2, 3]
print(lst[0]) # 1

이는 단순한 용어의 혼동이다.

보통 컴퓨터 공학에서의 리스트는 위에서 말한 리스트를 의미하지만,

파이썬에서는 리스트라는 용어를 다르게 사용한다.

파이썬에서 리스트가 어떻게 작동하는지 내부를 들여다보면,

파이썬의 리스트는 배열처럼 구현이 되어 있다.

즉, 파이썬 리스트의 아이템들은 메모리 상의 연속적인 위치에 배치되며, 인덱스를 사용하여 접근이 가능하다.

🔎 왜 파이썬에서는 배열을 List라고 할까?

ArrayList특징을 정리해보면서 생각해 본 것이다.

​ ◽ 파이썬에서 리스트(배열)는 가변 길이를 가진다.

배열의 특징 중 길이는 고정이다.

요소를 하나 더 추가하고 싶다면 새로운 배열을 선언하여 복사하여 옮겨주는 작업이 필요하다.

하지만, 파이썬에서는 append를 활용하여 자유롭게 요소를 추가할 수 있다.

lst = [1, 2, 3]
lst.append(4)

print(lst) # [1, 2, 3, 4]
print(len(lst)) # 4

이렇게 append를 사용하여 손쉽게 요소를 추가할 수 있으며

추가한 뒤 길이는 늘어나게 된다.

◽ 파이썬에서 리스트(배열)는 데이터 삭제시 빈공간으로 남지 않는다.

배열의 경우 데이터를 중간에 삭제하게 되면 빈공간으로 남아서 메모리 낭비가 생긴다.

하지만, 파이썬에서는 append, pop으로 자유롭게 요소를 추가, 삭제할 수 있으며
삭제한 뒤에는 빈공간이 남지 않고 바로 다음에 위치한 요소로 자리가 채워진다.

lst = [1, 2, 3, 4]
lst.pop(2) # 3을 삭제

print(lst) # [1, 2, 4]
print(len(lst)) # 3

이런 위와 같은 특징 때문에 배열보다는 리스트라는 이름을 사용하는게 아닐까 싶다.

profile
안녕하세요~ 개발을 꿈꾸는 하얀족제비입니다!

1개의 댓글

comment-user-thumbnail
2023년 3월 27일

안녕하세요

리스트 공부를 하다 궁금증이 생겨 찾아보다가 방문하게 되었습니다.

질문이 하나있는데 만약에 리스트에 크기를 6으로 할당했는데 데이터 추가시에 뒤에 메모리가 사용중이면 메모리관점에서 리스트는 다시 할당이 되는건가요??

답글 달기