2022.12.02. 최초 작성
컴퓨터에서 데이터를 저장하는 곳은 주기억장치와 보조기억장치이다.
주기억장치는 보통 메모리라고 부르며 프로그램이 실행 중인 동안 필요한 데이터를 기억하고 컴퓨터를 종료하면 데이터는 사라진다.
보조기억장치는 저장매체에 따라 HDD 또는 SSD라고 부르며 영구히 저장할 목적으로 데이터를 기억하며 컴퓨터가 종료되어도 데이터는 사라지지 않는다.
프로그램이 실행 중인 동안 사용하는 메모리에 데이터를 임시로 보관하며 사용하기 때문에 메모리에 데이터가 어떻게 저장되는지 아는 것은 매우 중요하다.
프로그램을 개발하면서 수많은 변수를 생성하고 변수에 데이터를 넣고 활용한다. 변수를 만들고 사용할 때 메모리에서 어떤 일이 벌어지는지 이해하는 것과 그렇지 못한 것은 프로그래머로의 역량에 큰 차이를 보일 것이다.
우선 데이터를 저장하는 단위를 알아야 한다. 정보표현의 최소 단위는 비트(bit)이고 저장할 때 기본 단위는 바이트(byte)이다. 1바이트는 8비트로 이루어져 있다.
비트는 0 또는 1의 정보만 나타낼 수 있고 2진수로 표현된다. 0은 전원이 꺼진 상태인 OFF 또는 거짓인 상태인 False, 1은 전원이 켜진 상태인 ON 또는 참인 상태인 True로 표현할 수 있다.
바이트의 크기는 1024를 곱하면 높은 단위가 된다. 컴퓨터는 2진수를 사용하므로 2^10을 곱한다. 테라바이트보다 더 큰 단위도 있고 앞으로 용량이 더 커지면 새로운 단위가 나올 것이다.
1바이트 x 1024(2^10) = 1킬로바이트(KB)
1킬로바이트 x 1024(2^10) = 1메가바이트(MB)
1메가바이트 x 1024(2^10) = 1기가바이트(GB)
1기가바이트 x 1024(2^10) = 1테라바이트(TB)
메모리에 바이트 단위로 데이터가 저장된다는 것은 실제 메모리의 기억공간을 바이트 단위로 관리한다는 것이다. 실제 메모리는 전자 부품이므로 일반 사람들은 내부를 볼 수 없고 봐도 이해할 수 없다. 그래서 사람들이 이해하기 쉽도록 추상화하면 아래 그림과 같다.
엑셀의 화면이다. 셀 한 칸을 1바이트라고 생각해보자.
메모리는 공장에서 생산될 때 1바이트마다 주소를 붙여 관리하기 편하도록 구조를 만들다. 인간이 땅에 지번을 붙이거나 건물에 호수를 붙여 주소를 관리하는 개념과 다르지 않다.
컴퓨터는 주소를 2진수로 관리하는데 너무 길어서 보통 16진수로 표현한다. 하지만 16진수로 표현해도 길어서 편의상 16진수 4자리로 생각하면 0000 ~ FFFF 범위를 갖게 된다.
하드웨어인 메모리 반도체는 이렇게 1바이트씩 주소를 할당하고 바이트 단위로 관리한다. 소프트웨어에서 메모리를 관리하는 것은 운영체제인데 프로그램이 실행되면 해당 프로세스에 논리적인 가상 메모리로 4GB를 할당한다. 이 4GB 용량은 절대적이라고 생각할 필요는 없고 운영체제의 변화에 따라 달라질 수 있다.
이렇게 프로세스에 할당된 논리적 가상 메모리는 용도에 따라 공간을 나누어서 사용한다. 세분화하는 관점에 따라 조금 다르게 부를 수 있지만 대부분 코드영역, 데이터영역, 힙 영역, 스택 영역으로 나눈다.

데이터영역, 힙영역, 스택 영역에 int 정수 데이터를 저장하는 코드이다.
#include<stdio.h>
#include<stdlib.h>
int a = 10;
void main() {
int b = 20;
printf("a : %d, b : %d\n", a, b);
int* c = (int*)malloc(sizeof(int));
*c = 30;
printf("c : %d\n", *c);
free(c);
}
변수 a는 전역변수여서 데이터영역에 저장된다. 변수 b는 main 함수 안에 선언한 지역변수여서 스택 영역에 저장된다.
변수 c는 포인터 변수로 b와 마찬가지로 main 함수 안에 선언한 지역변수여서 스택 영역에 저장된다. 하지만 malloc으로 동적 할당된 공간은 힙 영역에 저장된다.
동적할당에 대해서는 다음에 자세히 알아보고 지금은 그냥 넘어가기로 한다.

힙 영역의 경우 프로그램이 실행 중인 상황에서 필요한 순간에 필요한 만큼 공간을 확보하고 메모리의 주소만으로 관리한다. 위 그림처럼 스택 영역의 변수 c에서 힙 영역을 참조하는 구조이다.
그런데 힙 영역에서는 왜 미리 변수를 정의할 수 없을까? 힙 영역과 다른 영역의 차이점은 동적할당인데 이 둘은 무엇이 다를까?
이 원인을 알려면 좀 더 근본적으로 변수를 선언할 때 메모리에서 공간을 확보하는 방법을 알 필요가 있다.
다음에 변수와 메모리 2편에서 변수를 선언하여 메모리에 공간이 확보되며 데이터가 저장되는 과정을 살펴보겠다.
'자료구조' 카테고리의 다른 글
변수와 메모리 2 (공간 할당과 데이터 저장 중점으로) (0) | 2022.12.25 |
---|