C# 강의 - 09 메모리
메모리는 빠른 업무 처리를 도와주는 임시 보관 창고입니다.
2021-02-12

컴퓨터에는 아주 중요한 일을 하는 직원이 있습니다. 우리가 가지고 있는 파일들을 빠르게 처리할 수 있는 직원인데요. 이 직원을 중앙처리장치(CPU)라고 합니다. 이 CPU는 컴퓨터에서 가장 빠르게 일을 처리할 수 있는 장치입니다.

그리고 컴퓨터에는 아주 중요한 창고가 있습니다. 우리가 찍은 사진이나 작성한 문서 등을 보관하는 창고인데요, 이 창고를 디스크(Disk)라고 합니다. 이 디스크에는 아주 많은 파일들을 보관할 수 있고, 특별한 일이 없다면 사라지지 않고 오랫동안 보관됩니다. 그런데 단점이 하나 있어요. 이 파일들을 사용하려고 할 때 속도가 너무 느리다는 것입니다. CPU가 아무리 성능이 좋고 빨라도 디스크가 CPU에게 데이터를 늦게 주면 전체적인 속도는 느려질 수 밖에 없습니다.

그래서 컴퓨터에는 임시 보관 창고가 있습니다. CPU가 처리할 데이터를 미리 디스크에서 가져와서 임시 보관하는 것이죠. 이 임시 보관 창고를 메모리(Memory)라고 합니다. 그리고 이 메모리는 데이터를 CPU에게 빠르게 전달하여 전체적인 속도를 증가시키는 중요한 역할을 합니다. 메모리는 프로그래머라면 꼭 관심을 가져야 할 장치이자 중요한 개념입니다.




메모리에는 다음과 같이 몇 개의 방이 있습니다. 그리고 이번 시간에 주목할 것은 맨 아래에 보이는 스택(Stack)이라는 방입니다.


그럼 지금부터 우리가 작성한 코드가 동작할 때 메모리에서 어떤 일이 일어나는지 알아보겠습니다. 다음과 같이 컴퓨터에 10bytes의 메모리가 있고, 이 메모리를 모두 사용할 수 있다고 해보겠습니다. 10bytes는 80bits니까 메모리는 80개의 공간들이 있겠죠? 그리고 이 메모리의 스택 영역을 아래와 같이 확대해보겠습니다.




만약 다음과 같이 코드를 작성하고 실행한다면 메모리의 스택 영역에서는 어떤 일이 일어날까요?

static void Main(string[] args)
{
    int alpha = 3;
}


변수 alpha의 데이터 타입이 int이기 때문에 변수는 32비트의 크기를 갖습니다. 그리고 이 데이터를 메모리의 스택에 넣는데요, 이 작업을 Push라고 합니다. 그리고 상자에 물건을 넣듯이 맨 아래에서부터 쌓이게 되고요, 그림으로 표현하면 아래와 같습니다.


변수 하나를 더 추가해보겠습니다.

static void Main(string[] args)
{
    int alpha = 3;
    int beta = 2147483647;
}


위 코드를 실행하면 다음과 같이 진행됩니다. 이미 보관하고 있는 alpha 데이터 위에 beta 데이터를 쌓아올리게 됩니다. 이 때 주목할 점은 int 변수에 3을 넣든지, 2147483647을 넣든지 상관없이 메모리는 int의 크기인 32bits만큼 할당한다는 점입니다.




선언한 변수들을 모두 활용하고 메서드가 종료되는 시점에는 어떤 일이 일어날까요? 아래 코드의 주석처럼 메서드의 유효 범위(Scope)가 종료되는 부분을 지나가면 어떤 일이 일어날까요?

static void Main(string[] args)
{
    int alpha = 3;
    int beta = 2147483647;
} // 유효 범위가 종료되는 부분


상자에서 물건을 모두 빼려면 가장 위에 있는 물건부터 빼듯이, 스택에서도 가장 마지막에 쌓인 데이터부터 빼게 됩니다. 그리고 이 작업을 Pop이라고 하고요. 마지막에 들어간 데이터가 먼저 나온다는 것을 후입선출(Last In First Out)이라고 합니다.




변수 하나를 더 추가해볼까요?

static void Main(string[] args)
{
    int alpha = 3;
    int beta = 2147483647;
    int gamma = 22;
}


위 코드를 실행하면 beta 데이터 위에 gamma 데이터를 Push하기 전에 공간이 남아있는지 확인하는데요, 만약 공간이 남아있지 않다면 Overflow가 발생하게 됩니다. 그리고 이것을 Stack Overflow라고 하고요, 그림으로 표현하면 아래와 같습니다.