백앤드 API의 핵심은 데이터의 처리이다. 데이터를 처리하기 위해서는 데이터를 수집하고 저장해야 하는데, 어떻게 하면 효율적으로 저장할 수 있을까?
만약 사과가 있는데 이것을 저장해야 한다. 그렇다면 어디에 저장하는 것이 좋을까? 그것은 목적에 맞게 달라질 것이다. 오랫동안 들고 다닐 것인지, 자주 꺼내 먹을 것인지, 갈아 먹을 것인지 등등...
자료구조의 종류가 여러가지가 있는 것은 여러가지의 목적에 맞게 데이터를 사용하기 위해서이다.
Primitive : INTEGER, FLOAT, STRING, BOOLEAN
일반적으로 자료구조라고 한다면 Non Primitive: Array, List: Linear: Stack, Que, Non Linear: Tree, Tuple Dictionary Set, File
를 말한다.
주로 이용하는 자료구조 중에 하나이다.
자료들을 쭉 나열한 것이라고 볼 수 있다. 실제 메모리(메모리는 빠르다. 하지만 용량이 크지 않다. 그래서 저장을 해야할 때는 하드 디스크에 저장을 한다. 자료구조는 메모리에서 사용된다)
상에서 물리적으로 바로 옆에 저장이 된다. 그렇기 때문에 순서가 생긴다. 즉, Index가 생긴다는 의미이다.
Index를 알고 있다면 해당 자료에 곧바로 접근할 수 있다. 또, Index가 있기 때문에 slice
를 사용할 수 있다. 자료를 자른다는 의미이다.
Array를 생성할 때, 중간에 다른 메모리가 끼여 있으면 안되기 때문에 항상 일정 분량의 메모리를 차지하고 있다. Default Size가 보통 정해져 있다. C와 같은 언어에서는 다 지정하게 되어 있다. Python도 C-Array를 사용할 수는 있다.
만약 이미 할당되어 있는 Array의 크기보다 더 큰 Size의 자료를 저장하고자 할 때, Array Resizing이 일어난다. 이것은 높은 비용을 발생시키기 때문에 만약 Resizing이 자주 일어날 것 같은 자료라면, 애초에 Array를 사용하면 안된다.
Array의 중간에 있는 자료를 지우게 될 경우, 뒤에 있는 모든 자료들을 물리적으로 이동시켜야 하기 때문에 비효율적일 수 있다. 만약 추가, 삭제가 빈번하게 일어난다면 Array를 사용하지 않는 것이 좋다.
Multi Dimensional Array
Array의 요소가 Array가 되는 것이다. 바둑판, 매트릭스와 같은 2D, 2차원의 자료들에 많이 사용된다. 특정 메모리를 읽어들이는 것과 Index를 찾아 조회하는 것이 거의 비슷하기 때문에 굉장히 빠르고 효율적이다.
언제 쓰면 좋은가
배열과 마찬가지로 순차적으로 저장하는 자료구조이다.
한번 바꾸면 변경할 수가 없다. (Immutable)
주로 2, 3개의 소규모 데이터를 저장할 때 쓰인다.
좌표를 나타낼 때 많이 쓰인다. class를 만들어 쓰는 것보다 효율적이다.
두개 이상의 값을 함수에서 반환할 때 쓰일 수 있다.
def test:
return ('a', 8)
s, n = test()
# s == 'a'
# n == 8
파이썬에는 네임드 튜플 같은 것도 있다(Named Tuple).
배열과 달리 순서가 없다.
고로 Index가 없다.
중복된 값이 허용되지 않는다.
my_set = { 1, 2, 3, 1, 2 }
my_set
# (1, 2, 3)
for n in my_set:
print(n)
# 1
# 2
# 3
새로운 값이 넣었을 때, 이미 해당 값과 똑같은 값이 있다면 기존의 값을 치환해버린다.
자동자 번호판, 주민번호, 전화번호부 등에 사용될 수 있다.
Big O Notation O(N**2)
의 경우 Set를 사용하면 훨씬 효율적일 수 있다.
O(N)
Set는 해당 값의 해시값을 구한 뒤에, 그 값을 Index로 이용해서 값을 바로 찾아낼 수 있다. O(1)
Key : Value
의 형태로 저장하는 자료구조이다.Stack & Queue 직접 구현해보기
O(Log N)