자료 구조란?
자료 구조란 연관성이 있는 데이터를 모아놓은 방식을 말한다. 파이썬에는 내장 자료 구조가 있는데 list, tuple, dictionary 등이다.
효율적인 개발 시스템-데이터에 편리하게 접근할 수 있고 데이터 조작이 용이한-을 구축하기 위해서는 자료 구조를 만드는 단계에서부터 어디서 어떻게 사용할 데이터를 위한 구조인지 명확하게 정의해야 한다.
Array와 List 차이
Array와 list는 기본적으로 비슷한 자료 구조다. 일반적으로 JavaScript에서는 array, Python에서는 list라고 생각하면 쉽다. 엄밀히 말하면 array와 list는 다르다. list가 좀 더 유연하게 데이터를 담을 수 있지만 그렇기 때문에 메모리를 더 많이 차지한다. 하지만 Python에서 array를 사용하기 위해서는 import를 해와야 하기 때문에 파이썬에서는 list를 쓰는 것이 편리하다. 아래에서는 array를 list로 갈음하고 기술하겠다.
List 특징
- 시퀀스형 List는 앞에서부터 순서대로 데이터를 저장한다. 요소를 추가하면 가장 뒤에 있는 요소 뒤로 들어간다.
- 수정 가능 List를 이미 선언했더라도 요소를 삭제하거나 추가할 수 있다.
- 중복 허용 같은 값도 여러 번 들어갈 수 있다.
- 다양한 자료 구조 List 안에 또다른 list를 넣어서 다중 차원 list를 만들 수 있다. 또한 tuple이나 dictionary 형태도 담을 수 있다.
List 구조
List에는 요소 하나하나가 들어갈 수 있는 자리가 있는데, 빈 칸 없이 앞에서부터 차례로 데이터를 쌓는다. 첫 번째 요소 인덱스 값이 0부터 시작해서 다음 요소는 인덱스 1, 그 다음 요소는 인덱스 2가 된다.
반대로 List 가장 마지막 요소부터 인덱싱을 할 수도 있다. 마지막 요소는 인덱스 -1, 그 앞 요소는 인덱스 -2다.
List 단점
- 요소 추가/제거 시 다소 무거운 동작 방식 위에서 언급했듯 list 자료 구조는 데이터를 앞에서부터 빈 자리 없이 꽉 채워 쌓는다. 따라서 중간에 있는 요소 하나를 삭제했을 때, 그 뒤를 잇는 모든 요소의 자리를 앞으로 한 칸씩 이동해주어야 한다. 요소를 추가했을 때도 마찬가지로, 추가된 요소 이후의 모든 요소의 자리를 뒤로 한 칸씩 이동해준다. 따라서 list는 자주 변경해야 하는 데이터를 담기에는 적절하지 않은 자료 구조다.
- 메모리 재할당 시 데이터를 처음부터 다시 쌓아야 하는 동작 방식 List는 데이터를 순차적으로 쌓기 때문에 list가 처음 생성될 때 어느 정도 메모리를 미리 할당한다(pre-allocation). 하지만 list가 미리 할당한 메모리를 초과해서 데이터를 쌓게 된다면 메모리 크기를 다시 조정해주어야 한다.
이때 list는 pre-allocation 사이즈를 초과한 데이터부터 새 메모리에 저장하는 게 아니라 새 메모리에 처음부터 데이터를 다시 쌓기 시작한다. 데이터 사이즈가 예측한 메모리를 넘을 경우 추가 작업이 생기므로, 사이즈를 예측하기 힘든 데이터에는 부적절하다.
List를 사용하면 좋은 데이터 종류
- 값보다 순서가 중요한 데이터 (예 - 주식 차트)
- 다차원 데이터
- 빠르게 읽어야 하는 데이터 (index로 곧바로 읽을 수 있다.)
- 사이즈 변동 폭이 크지 않은 데이터
- 자주 삭제되거나 추가되지 않는 데이터
Tuple이란?
Tuple 또한 list와 마찬가지로 시퀀스형 자료 구조다. 하지만 tuple은 한 번 선언 후 요소를 삭제하거나 추가하는 것은 불가능하다. 따라서 tuple은 list보다 메모리를 적게 사용한다. 주로 2~3개 정도의 작은 사이즈 데이터를 다룰 때 사용한다.
Tuple 장점
-
간단한 값을 빠르게 리턴할 수 있다.
# Tuple을 사용하는 경우 [(1,2), (2,4)] # Tuple을 안 쓰는 경우에는 class를 생성해야함 class Cord: def __init__(self, x, y): self.x = x self.y = y
Tuple 단점
- 데이터를 맥락으로 파악해야 한다. Dictionary는 key와 value가 명시되어있기 때문에 자료 의미를 정확하게 파악할 수 있지만 tuple은 값만 담고 있기 때문에 의미가 명확하지 않다.
Tuple을 사용하면 좋은 데이터 종류
-
간단한 데이터 (예 - 좌표 데이터)
coordinations = [ (1, 2), (3, 4), (5, 6) ]
복습
Q1. 자료구조의 정의와 중요한 이유를 설명하세요. A1. 자료 구조란 연관성이 있는 데이터를 모아놓은 방식을 말합니다. 효율적인 개발 시스템, 즉 데이터에 편리하게 접근할 수 있고 데이터 조작이 용이한 시스템을 구축하기 위해서는 자료 구조를 만드는 단계에서부터 어디서 어떻게 사용할 데이터를 위한 구조인지 명확하게 정의해야 합니다.
Q2. Array(List)의 가장 큰 특징과 그로 인해 발생하는 장점과 단점에 대해 설명하세요. A2. 리스트는 자료를 순차적으로 쌓고 각 요소에 인덱스 번호를 부여합니다. 따라서 리스트의 중간 요소를 삭제하거나 추가했을 때 뒤따르는 모든 요소 위치가 하나씩 앞으로 당겨지거나 뒤로 밀립니다. 이 모든 과정이 메모리를 차지하는 작업이므로 자주 변경되는 데이터를 다룰 때는 적합하지 않은 자료 구조입니다. 하지만 인덱스를 통해 원하는 데이터를 빠르게 읽을 수 있습니다. 또한 리스트는 또다른 리스트를 담을 수 있기 때문에 다차원 데이터를 표현할 수 있습니다.
Q3. Array를 적용 시키면 좋을 데이터의 예를 구체적으로 들어주세요. (ex. 주식 차트) 구체적 예시와 함께 Array를 적용하면 좋은 이유, 그리고 Array를 사용하지 않으면 어떻게 되는지 함께 서술해주세요. A3. 환율 그래프. 환율 그래프 또한 주식 차트와 마찬가지로 일정 시간마다 새 데이터가 들어옵니다. 어제 환율값과 오늘 환율값이 같을 수는 있지만 순서는 분명히 구분해주어야 합니다. 따라서 요소 중복은 허용하되, 데이터가 들어온 순서대로 쌓는 리스트 자료 구조로 처리하기 적합합니다. 만약 중복을 허용하지 않는 자료 구조(예 - set)를 사용할 경우, 어제 환율과 오늘 환율이 같을 때 오늘 환율이 어제 환율을 덮어쓸 것입니다. 그러므로 모든 데이터를 누적해서 나타내주어야 하는 환율 차트에는 리스트 자료 구조가 적합합니다.