본 게시물은 코드잇의(codeit) 자료구조 시리즈 강의 첫번째 주제인 '기본 자료구조들'을 듣고 정리한 게시물임을 알려드립니다.
1. 스토리지 vs 메모리
자료구조의 목적
- 자료들을 어떻게 구조화할지 고민해서 데이터를 효율적으로 사용하는 것
- 컴퓨터에 데이터가 어떻게 저장되는지에 대한 최소한의 지식은 있어야 한다.
데이터가 저장되는 곳 : 스토리지(Storage), 메모리(Memory)
1) 스토리지
- 데이터가 영구적으로 저장되는 곳
- 컴퓨터에 저장해놓는 사진, 워드문서, 음악 등
- 사용자가 지우지 않는 이상 사라지지 않음
특징
- 데이터를 저장하는 데 오래 걸린다.
- 데이터를 받아오는 데 오래 걸린다.
→ 정확히 언제 사용할지 모르겠는 파일을 저장
2) 메모리
- 데이터가 임시로 저장되는 곳
- 워드 파일에 과제를 작성할 때 저장을 누르지 않는 이상 메모리에만 저장됨. 저장을 눌러야지 스토리지에 저장됨
특징
- 데이터를 저장하는 데 빠르다.
- 데이터를 받아오는 데 빠르다.
메모리와 스토리지가 둘 다 필요한 이유
- 스토리지에서 한장면씩 갖고오면 시간이 너무 오래걸림
- 영화 파일을 켜면 스토리지에 있던 영화를 메모리로 복사함. 그래서 쾌적하게 볼 수 있는 것
- 영화를 끄면 메모리에 있던 영화는 지워지고 스토리지에 있던 영화만 남게됨
자료구조를 공부할 때?
- 스토리지를 얘기할 일은 없고, 결국 데이터를 메모리에서 잘 사용하도록 하는 게 목적
2. RAM : Random Access Memory(임의 접근 메모리)
메모리는 비유를 하자면 하나의 긴 띠라고 생각할 수 있다.
- 일정한 칸으로 나눠져 있다.
- 각 칸에 데이터를 저장할 수 있다.
- 각 칸은 자신만의 주소가 있다. (데이터를 찾을 수 있게끔)
컴퓨터가 아래의 값 x, y를 받아오는 방식
- 임의 접근 : 저장 위치를 알면 접근할 때 항상 일정한 시간이 걸림
- 다시말해, 램은 원하는 값이 95에 있든 183에 있든 주소와 상관없이 다 한번에 찾을 수 있다는 것.
- 즉, 메모리에 저장한 데이터 접근 시간 복잡도 : O(1)
순차접근과 임의 접근
자료구조를 공부할 때 중요한 점
- 메모리는 임의 접근으로 동작하고 있다는 걸 늘 기억하고 있어야 함
3. 메모리의 기본 단위 : 바이트
메모리는 하나의 긴 띠라고도 표현했는데, 이 띠는
- 일정한 칸으로 나눠져 있고
- 각 칸에 데이터를 저장할 수 있고
- 각 칸은 자신만의 주소가 있는
특징이 있음
메모리의 기본단위 : 바이트
- byte : 메모리 한 칸이 저장할 수 있는 가장 기본적인 용량의 단위
→ 자료 구조를 공부하면서 바이트라는 단위가 정확히 얼만큼의 정보를 저장하는 단위인지는 몰라도 되고, 매우 작은 단위라고만 알고 있으면 된다.
- 바이트가 아닌 다른 크기의 용량을 담는 저장 장치들도 있긴 한데, 대부분의 현대 컴퓨터 시스템들은 메모리 한 칸에 바이트만큼의 데이터를 저장
- 일상 생활 속에서도 많이 사용되는 이 '바이트'라는 용어는 흔히 영상, 문서, 음성 파일이나, RAM 또는 컴퓨터의 스토리지의 크기를 표현할 때, 160 킬로 바이트(kB), 10 메가 바이트(MB), 32 기가 바이트(GB) 이런 식으로 많이 표현함
→ 이는 데이터의 용량이 몇 바이트인지 표현한 것. 정확히 말하면,
- 킬로 바이트 = 1,000 바이트
- 메가 바이트 = 1,000,000 바이트
- 기가 바이트 = 1,000,000,000 바이트
이만큼의 저장 공간 용량들
- 자료 구조를 배우면서 바이트나 다른 저장 공간 단위들을 심도 있게 다루지는 않을 건데, 그래도 자료 구조에서는 이해하면 도움이 되는 개념/용어이니까,
바이트는 컴퓨터 저장 공간 용량을 나타내는 단위다.
메모리 한 칸에 담기는 데이터 용량은 1 바이트다.
이 정도는 이해하고 넘어가는 게 좋음
4. 레퍼런스
- 언어마다 조금 다르긴한데 파이썬에서 X는 95라는 값 자체를 갖고 있는 게 아니라 95가 담겨있는 이 메모리 주소를 이용해서 정숫값 95를 찾아오는 것
레퍼런스의 개념
- 레퍼런스 : 데이터에 접근하게 해주는 값으로, 엄밀히말하면 레퍼런스와 주소는 다름. 그러나 자료구조를 공부하는 초심자 입장에서는 이 둘을 구분하는 것은 의미가 없으니 앞으로 자료구조 강의에서는 이 둘을 혼용해서 사용할 예정
- x와 5를 더할 때, x에는 95가 아니라 레퍼런스가 담겨 있는데, 이 레퍼런스와 5를 더하게 되는 것일까?
- x에 레퍼런스가 담겨 있는 건 맞지만, 값을 실제로 사용할 때는 파이썬이 알아서 값을 받아와 준다.
- 즉, 파이썬이 메모리에 있는 95를 받아와서 95+5를 해주는 것
- 그래서 "x가 정수 95를 갖고 있다" 라고 하는 말은 엄밀히 말하면 틀린 표현
5. 데이터의 주소
데이터가 저장되어 있는 주소를 알아내는 방법을 알아보자.
파이썬 id 함수
- id 함수 : 저장한 데이터의 메모리 주소를 정수로 표현한 값을 알아낼 수 있음
- 여러 타입의 데이터를 저장하고 id 함수를 써서 메모리 주소를 출력시켜보겠음
# 여러 데이터를 저장한다
list1 = [1,2]
int1 = 0
float1 = 3.14
set1 = set()
tuple1 = (2,3)
# 저장한 데이터의 메모리 저장 위치를 받아온다.
print(id(list1))
print(id(int1))
print(id(float1))
print(id(set1))
print(id(tuple1))
- 데이터가 각각 다른 메모리 주소에 저장돼 있음
- 주소는 코드를 돌릴 때마다 다르게 나옴
같은 주소에 저장돼 있는 데이터 : 똑같은 주소에 저장돼 있는 데이터는 똑같은 데이터
우선 세 변수 list1, list2, list3를 만들어보자.
- list1은 정수 1, 2를, 그리고 list3은 1, 2, 3을 담고 있는 리스트
- 그리고 list2에 list1를 지정했음
→ 메모리에서 만든 하나의 같은 리스트를 list1, list2라는 두 개의 다른 변수가 가리키고 있는 것
- 이렇게 여러 변수가 같은 메모리를 가리키는 것을 Aliasing이라고 함
list1 = [1, 2]
list3 = [1, 2, 3]
# Aliasing을 통해 list1과 list2를 같게 한다
list2 = list1
# 두 데이터의 메모리를 출력한다
print(id(list1))
print(id(list2))
print(id(list3))
- id 함수를 써서 list1과 list2의 메모리 주소를 출력해 보면 같다고 나온다.
- list3는 다른 주소에 저장되어 있음
- list1과 list2는 서로 같은 리스트를 가리키고 있기 때문에 똑같은 메모리가 출력되고, list3는 전혀 다른 리스트를 가리키고 있기 때문에 다른 메모리가 출력
6. 연습문제
연습문제 정답
질문 1
질문 2
'IT 일반 > 자료구조(개념) - [인강] 코드잇, [대학원] 전공 수업' 카테고리의 다른 글
[코드잇-자료구조1 : 기본 자료구조들] 5. 해시 테이블 (1) | 2024.10.04 |
---|---|
[코드잇-자료구조1 : 기본 자료구조들] 4. 링크드 리스트 (0) | 2024.10.04 |
[코드잇-자료구조1 : 기본 자료구조들] 3. 배열 (0) | 2024.10.04 |
[코드잇-자료구조1 : 기본 자료구조들] 1. 자료구조란? (0) | 2024.10.04 |
추상화, 추상자료형(ADT), 자료구조 (0) | 2024.10.04 |