자료 구조

김기현·2022년 5월 10일
0
post-thumbnail

기본 자료 구조들

1. 자료 구조란?

데이터를 저장하고 관리하기 위한 구조입니다.

도서관을 예로 든다면!
"로미오와 줄리엣"이라는 책을 찾기 위해선 자기계발, 문학, 경제, 역사 등등의 카테고리에서 문학 구역을 선택 후 영문고전, 추리소설 등등의 구역에서 영문고전을 선택합니다. 책장에는 여러 고전들이 일정한 순서를 가지고 정렬되어있는데, 그 순서대로 로미오와 줄리엣이 있는지 찾아갑니다.

이미 그 책이 일정한 구조(문학 => 영문고전 => 연도 순)를 가지고 도서관에 정렬되어있기 때문입니다.

컴퓨터에 데이터를 저장할 때도 도서관에 책을 저장하듯이 일정한 구조에 맞게 저장합니다. 그리고 이를 자료구조라고 합니다.

학문적인 정의로는 데이터의 효율적인 접근 및 조작을 가능하게 해주는 저장 및 관리 방식입니다.
쉽게 찾기 위해서는 특정 구조를 만들어서 관리를 해야 합니다. 자료 구조를 공부하면서 데이터를 관리할 수 있는 방법들과 적합한 구조를 선택하는 방법을 익힙니다.

2. 컴퓨터가 데이터를 저장하는 방법

자료 구조의 목적은 자료를 구조화해서 데이터를 효율적으로 사용하기 위함입니다. 우선 자료 구조를 배우려면 컴퓨터에 데이터가 어떻게 저장되는지 알아야 합니다.

스토리지 VS 메모리

컴퓨터는 데이터를 크게 두 곳에 저장합니다.

스토리지는 데이터가 영구적으로 저장되는 곳입니다. 사용자가 직접 삭제하거나 심각한 충격이 가해지지 않는 한 삭제되지 않습니다.

스토리지는 정보를 많이 저장할 수 있는 대신 데이터를 저장하는데 오래 걸리고 데이터를 받아오는데 오래 걸립니다. 마치 창고와 같은 느낌입니다. 정확히 언제 사용할 지 모르는 파일을 저장합니다.


메모리는 데이터를 임시로 저장하는 곳입니다.

워드에 글을 적고 저장 버튼을 누르기 이전엔 메모리에 저장되어있으며 저장 버튼을 누르면 스토리지로 복사해 저장하게 됩니다.

메모리는 보통 스토리지 용량보다 작지만 데이터를 저장하는데 빠르고 데이터를 받아오는데 빠르다는 특징이 있습니다. 그래서 지금 당장 사용해야 할 데이터를 저장합니다.

영화를 본다고 예시를 들 때 스토리지에서 한 장면씩 실시간으로 가져온다면 영화가 끊길텐데요~ 그래서 스토리지에 있는 영화 데이터를 메모리에 옮긴 후 쾌적하게 영화를 볼 수 있고, 영화를 종료할 때 메모리에서 삭제됩니다. 그래서 스토리지랑 메모리가 둘 다 필요합니다.

자료 구조를 공부할 때는 데이터를 메모리에서 잘 사용하는 방법을 찾는게 목적입니다.

RAM(Random Access Memory)

메모리는 하나의 긴 띠로 일정한 칸으로 나뉘어있고 각 칸에 데이터를 저장할 수 있고 각 칸은 자신만의 주소가 있습니다.

x = 95
y = True

이라는 코드를 저장할 때는 다음의 사진처럼 저장됩니다.

RAM에서 Random Access이라는 단어, '임의 접근'은 저장 위치를 알면 접근할 때 항상 일정한 시간이 걸린다는 특징이 있습니다. 처음부터 순서대로 접근하는 '순차 접근'과는 반대의 개념입니다.

그래서 메모리에 저장한 데이터를 접근하는데의 시간 복잡도를 계산 하자면 O(1)로 계산할 수 있습니다.

메모리의 기본 단위

메모리는 하나의 띠로 표현될 수 있고, 다음의 특징이 있습니다.

  • 일정한 칸으로 나뉘어있다.
  • 각 칸에는 데이터를 저장할 수 있다.
  • 각 칸은 자신만의 주소가 있다.

이 메모리 한 칸이 저장할 수 있는 가장 기본적인 용량의 단위는 byte입니다.

저장 공간 용량은 다음과 같습니다.

  • 킬로 바이트(kB) = 1,000 바이트
  • 메가 바이트(MB) = 1,000,000 바이트
  • 기가 바이트(GB) = 1,000,000,000 바이트

레퍼런스

x = 95

정수 95를 x에 저장했습니다. 파이썬에서 정확한 표현은 x는 95다는 것이 아닌 x는 95가 담긴 메모리 주소를 지칭합니다. x는 95를 가르킨다.

이 때 데이터에 접근하게 해주는 값을 레퍼런스라고 합니다. 추상적인 개념으로 데이터에 접근할 수 있게 해주는 포괄적인 값, "주소"보다는 조금 더 포괄적인 개념입니다.

데이터의 주소

데이터가 저장되어 있는 주소는 다음과 같습니다.

# 여러 데이터를 저장
list1 = [1, 2, 3]
int1 = 11
float1 = 3.1
set1 = set()
tuple1 = (2, 3)

# 저장한 데이터의 메모리 저장 위치를 받아온다
print(id(list1))
print(id(int1))
print(id(float1))
print(id(set1))
print(id(tuple1))
# 결과
140237662138184
4450309504
140237661913472
140237664406888
140237662993992

각 데이터는 각각 다른 메모리 주소에 저장되어있습니다. 하지만 아래의 예시는 같은 주소에 저장되어있는 데이터입니다.

# 리스트를 정의한다
list1 = [1, 2]
    
# Aliasing을 통해 list1과 list2를 같게 한다
list2 = list1
    
# 두 데이터의 메모리를 출력한다
print(id(list1))  # 140657629409160
print(id(list2))  # 140657629409160

하나의 같은 리스트에list1list2라는 두개의 다른 변수가 가리키고 있는데, 이를 Aliasing이라고 합니다.

profile
피자, 코드, 커피를 사랑하는 피코커

0개의 댓글