[번역] Array vs. List vs. Python List

폐쇄맨·2020년 7월 3일
4

번역

목록 보기
2/5

배열과 리스트의 차이는 약간 헷갈리는 부분이다. 특히 파이썬에서 배열을 List라고 부르기 때문에 더욱 그럴 것 이다. 아래의 글을 읽고 명확하게 이해했으면 하는 바람이다.

Arrays

배열은 리스트와 몇 가지 공통점이 있다:

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

둘의 가장 극명한 차이점은 배열은 인덱스를 가지지만 리스트는 그렇지 않다는 것이다.

배열이 메모리에서 어떻게 저장되는지 알면 그 차이점을 이해하는데 도움이 된다. 배열이 생성될 때, 항상 크기가 주어진다 - 즉, 배열이 담을 수 있는 아이템들의 개수를 뜻한다 (그리고 각 아이템의 크기도 알아야한다). 컴퓨터는 해당 배열을 위한 공간을 메모리에 할당해준다.

여기서 중요한 것은, 할당된 메모리 공간은 연속적이라는 점이다. 즉, 배열의 아이템들을 메모리 상에서 이어져서 배치된다는 것이다.

또 다른 배열의 특징은, 배열의 모든 아이템들이 똑같은 사이즈를 가진다는 것이다.

우리가 배열을 시각화 할 때, 주로 연속된 박스의 나열을 그려넣는다.
배열의 시각화

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

예를 들면, 첫번째 아이템의 메모리 위치가 00이고 사이즈가 24 바이트 일때, 바로 다음 아이템은 00 + 24 = 24에 위치하게 된다. 또 그 다음 아이템은 24 + 24 = 48 이며, 이런 식으로 계속될 것이다.

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

Lists

반면에, 리스트는 아이템들의 메모리 주소가 연속적일 수도 있고, 아닐 수도 있다. 예를 들어, 하나의 아이템이 다음 아이템을 포인팅하는 Linked List가 있다. 하지만 각 아이템들은 메모리 상에서 모두 흩어져 있을 수도 있다. 이 경우에는 첫번째 아이템의 주소를 알더라도, 다음 아이템의 메모리 주소를 간단히 계산할 수 없다는 것을 의미한다. 결국, 리스트는 배열처럼 아이템에 직접 접근하기 위해 인덱스를 사용할 수 없다는 뜻이기도 하다.

Python Lists

파이썬에서 리스트를 생성할 때 꺽쇠괄호 [ ]를 이용한다.

>>> my_list = ['a', 'b', 'c']
>>> my_list
['a', 'b', 'c']

그리고 우리는 인덱스를 활용하여 원하는 아이템에 접근할 수 있다.

>>> my_list[0]
'a'
>>> my_list[1]
'b'
>>> my_list[2]
'c'

위의 섹션에서 리스트는 인덱스를 가지지 않는다고 말하였다. 파이썬 리스트는 왜 인덱스를 가질까?

이것은 단순한 용어의 혼동에 불과하다. 보통, 컴퓨터 공학에서 리스트는 위의 섹션에서 말한 리스트를 의미한다. 하지만 파이썬에서는 리스트라는 용어를 다르게 사용한다.

파이썬을 공부하면서 알아야 할 점 중 하나는 다음과 같다: 파이썬에서 리스트가 어떻게 작동하는지 내부를 들여다 보면, 파이썬의 리스트는 배열처럼 구현이 되어있다는 것이다 (여기서 처럼이라는 표현을 쓴 이유는 정확하게 말하자면 Dynamic Array이기 때문이다). 구체적으로 말하자면, 파이썬 리스트의 아이템들은 메모리 상의 연속적인 위치에 배치되며, 인덱스를 사용하여 접근이 가능하다.

내부를 들여다 보면, 파이썬의 리스트는 좀 더 많은 기능을 담고있다. 예를 들어, 리스트에 아이템을 추가하고 제거하는 appendpop과 같은 메서드를 가지고 있다. 이런 메소드를 사용하여, 우리는 파이썬의 리스트를 스택처럼 활용할 수 있다.

기본적으로 자료구조를 공부할 때, pop이나 append와 같은 부가적인 메소드들의 사용은 지양해야한다. 이것들은 high-level 프로그래밍 언어의 기능일 뿐이며, 다른 언어에서는 지원하지 않는 경우도 있기 때문이다. 특정 언어와 관계없이 자료구조를 익히기 위해, 파이썬에서는 리스트를 단순 배열로만 생각하는 것이 좋다 (자료구조 공부할 때!).

정리해보자면:

  • 파이썬의 리스트의 근본은 배열이지만, high-level한 기능들이 추가되어 있다.
  • 자료구조를 공부할 때 파이썬의 리스트를 단순 배열로 취급한다.

이러한 접근법은 컴퓨터 공학의 근본이되는 자료구조를 이해하는데 도움을 줄 것이다.

profile
폐쇄맨

0개의 댓글