본문 바로가기
코딩테스트/자료구조와 메모리 구조 이해

자료구조와 메모리 구조 이해하기

by YUNZEE 2025. 5. 17.
728x90

1. 자료구조란

- 데이터를 저장하고 관리하는 방식

데이터를 저장하고 관리하는 방식을 자료구조라고 함

자료구조는 데이터를 체계적으로 저장하여 메모리를 효율적으로 사용할 수 있게 하고, 빠르고 안정적으로 데이터를 처리할 수 있도록 도와줌

 

예를 들어 보자면

 

변수가 많다면 하나하나 저장하기가 힘드니까, 비슷한 성질의 데이터를 모아서 

array자료 구조 같은 걸 사용해서 더 효율적으로 관리할 수 있음.

 

우리가 앞으로 배울 자료구조들은 아래 구조를 보면 알 수 있음.

 

메모리에는 크게 하드디스크램 메모리가 있음

우리가 코딩을 하고 저장 버튼을 누르면 코드들이 하드디스크에 저장이 됨

저장된 코드를 실행하면 램 메모리에 데이터가 올라가게 됨

 

우리의 관심사는 램 메모리에 있는데 만약에 우리가 비효율적인 자료 구조를 사용하면 램 메모리 낭비를 초래하고 프로그램 성능 저하의 원인이 됨, 그래서 용도와 상황에 맞는 자료 구조를 잘 선택해야 됨

1-1. Array

List를 잠깐 보자면 데이터를 순차적으로 나열해 놓은 집합임

LIST를 각각을 하나의 문자라고 생각했을 때,  Array로 구현한다면 데이터가 메모리상에 연속되게 저장이 됨

1-2. Linked List

Linked List로 구현을 한다면 그림처럼 메모리상에 불연속적으로 저장이 되지만, 다음 데이터의 위치를 가리킴으로써 연속성을 유지할 수 있음

Array는 데이터 접근이 쉽고 Linked List는 데이터 추가가 쉬움

 

2. 메모리

자료구조를 공부하기에 앞서 메모리에 대해서 알아보자면

RAM 메모리는 전기신호를 저장할 수 있는 트랜지스터라는 작은 반도체 소자로 이우어져 있음

트랜지서트에 전기가 ON 되면 1, OFF 되면 0을 나타냄

이를 이용해서 이진수, 즉 binary digit 0과 1을 표현할 수 있음 이를 bit라고 함

 

여기서 2bit는 몇가지를 숫자를 표현할 수 있을까?

00, 01, 10, 11 총 4가지의 숫자를 표현할 수 있음

 

그럼 8bit는 총 몇가지를 표현할 수 있을까? 먼저 8bit는 1byte라고 함

총 2^8가지 저장할 수 있음

 

이처럼 컴퓨터는 이진법(binary)을 사용하기 때문에 제대로 알고 넘어가야 됨

이와 더불어 16진법, 즉 헥사데시멀(hexadecimal)도 같이 살펴보자

이진수는 보통 2진수에 0b를 붙이고 16진수에는 0x를 붙임

8자리 이진수는 0부터 25까지 숫자를 표현할 수 있음

217은 이진수로 표현하면 1101 1001이 됨

16진수로 217을 나타내자면, 위의 표를 참고했을 때 0xD9가 됨

 

데이터의 기본 단위인 비트랑 바이트에 대해 알게 됐으니 이제 본격적으로 실제 우리 컴퓨터의 램이 얼마만큼의 비트를 저장할 수 있는지 한번 확인해 보자

 

만약에 내 노트북 램 메모리가 1MB 메모리를 사용한다고 가정했을 때

-> 메모리 단위란? 컴퓨터는 우리가 알고 있듯이 bit단위로 저장하는데, 이게 가장 작은 단위임.

-> 그 단위를 점점 크게 묶어서 우리가 보기 쉽게 만든 게 바이트, 킬로 바이트(KB), 메가바이트(MB) 같은 단위들임

 

8 bit, 즉 1바이트가 있는데 1바이트가 1024개 모이면 1KB(키로바이트 = 1,024 Byte )가 됨

1KB가 1024개가 모이면 1MB( 1,024 KB = 1,048,576 Byte )가 됨

-> 1,048,576개의 바이트 공간을 쓴다는 것은 100만 개 정도 문자를 저장할 수 있는 크기라는 의미

1GB로 할 수 있는 것들

📄 워드 문서 (글자만 있는 경우) 100KB ~ 1MB
🖼️ 사진 (고화질 1장) 약 2~5MB
🎵 음악 (MP3 1곡) 약 3~5MB
📹 동영상 (HD 영화 1편) 약 700MB~1.5GB
📱 모바일 앱 (일반) 50MB ~ 300MB
📱 게임 앱 500MB ~ 3GB 이상

 

이 넓은 메모리 공간 속에서 컴퓨터가 데이터를 찾으려면 어떤 지표가 있어야 됨

그래서 하나하나의 바이트마다 주소값을 달아놨음. 10진법으로 표현하기엔 너무 길어지기 때문에 16진법으로 주소를 표시할 것

첫 번째 바이트는 0x0, 두 번째 바이트는 0x1, 마지막으로 2^20은 0xFFFFF가 될 수 있음

 

10진수                                                                              16진수

0 0x0
1 0x1
10 0xA
15 0xF
16 0x10
255 0xFF

 

2-1. 메모리 할당

이번에는 메모리 할당에 대해서 알아보자 

c언어에서는 정수를 저장하는 int 데이터 타입이 있음

int는 메모리에서 4byte를 차지하게 되는데

int price = 290000000;

10진수:   290,000,000
2진수:  0001 0001 0100 0100 0010 0100 0000 0000
         ↑  ↑    ↑    ↑    ↑    ↑    ↑    ↑
        총 32비트 = 4바이트

이라는 2억 9천만 이라는 숫자를 저장해 본다고 했을 때

2억 9천만을 바이너리로 변환하고 4byte씩 나눠서 저장됨

 

Array는 메모리 상에서 연속적으로 할당됨

만약 1,2,3,4라는 인트형 변수 4개를 묶어서 저장하고 싶다면 이렇게 배열을 선언할 수 있음

int array[4] = {1, 2, 3, 4};

하나하나가 int형 변수이기 때문에 각각 4바이트씩 총 16바이트의 메모리를 차지함

메모리에서 연속적으로 할당하기 위해 16바이트의 메모리에 1,2,3,4를 이진법으로 저장을 하면 됨

각 데이터는 가장 작은 address를 대표 어드레스로 설정함

 

이번에 Linked List를 한번 본다고 했을 때

LinkedList는 Array와 다르게 메모리상에서 불연속적으로 저장이 됨

값만 저장한다면 1 다음의 값을 알 수 없음

그래서 value와 address를 같이 저장하는데 -> 노드라고 함

address의 메모리는 편의상 4바이트를 차지한다고 가정해 보면 하나의 노드당 메모리는 8byte가 됨

 

Linked List는 메모리상 불규칙하게 할당되어 있지만 다음 주소값이 적혀있기 때문에 연결된 채로 연속성을 유지할 수 있음

2. 알고리즘 algorithm

- 문제 해결 방법: 어떠한 문제를 해결하기 위해 정해진 일련의 절차나 방법

- 자주 쓰이는 문제 해결 방법은 패턴화

-> BFS, DFS, Binary Search, Dijkstra 등

- 한 문제에 해결할 수 있는 알고리즘은 다양함

-> 각 문제에 적합한 알고리즘을 선택할 수 있어야 함

-> 알고리즘을 평가할 수 있어야 함

 

알고리즘 평가 기준

- 시간 복잡도(Time Complexity)

- 공간 복잡도(Space Complexity)

- 구현 복잡도

 

시간복잡도와 공간복잡도는 보통 trade-off 관계임. 실행시간을 줄이기 위해서는 메모리를 더 사용해야 하고, 메모리 사용량을 줄이다 보면 실행시간이 늘어나게 됨. 코딩 테스트에서는 보통 실행시간을 줄이는 게 중요하기 때문에 메모리를 사용해서 실행시간을 줄이는 방법들을 배울 예정, 구현하기 쉬운 알고리즘을 선택하는 것도 중요

 

-> 다음 블로그에서는 시간 복잡도에 대해 공부할 예정

728x90