데이터 직렬화에 대한 공부를 하던 도중 힙(Heap)영역과 스택(Stack)영역에 대한 내용을 접하게 되었는데 어렴풋이 개념만 알고 있었던 힙과 스택에 대해서 정리해 보겠다.
프로그램이 실행 되기 위해서는 먼저 프로그램이 메모리에 로드 되어야 한다. 또한, 프로그램에서 사용되는 변수들을 저장할 메모리도 필요하다. 운영체제는 프로그램을 실행시키면 프로그램을 위해서 메모리 공간을 할당 해 주게 되는데, 이때 할당되는 메모리의 공간이 크게 스택, 힙, 데이터, 코드 영역으로 구분된다.
할당되는 장소는 메인메모리(RAM)에 할당되며, 프로그램 실행시 필요한 메모리 공간을 지정하기 위해서 할당되게 된다. 밑의 사진은 메모리의 구조를 간단히 그림으로 나타낸 것이다.
메모리의 코드(code) 영역은 실행할 프로그램의 코드가 저장되는 영역으로 텍스트(code) 영역이라고도 부른다.
CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리하게 된다.
메모리의 데이터 영역은 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역이다.
데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다.
메모리의 스택(stack) 영역은 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역이다. 스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다.
스택 영역은 후입선출(LIFO)의 자료구조 방식에 따라 동작하므로, 가장 늦게 저장된 데이터가 가장 면저 인출되게 된다. 스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당 되고, 스택 메모리를 이용하면 변수가 할당 된 위치에 값만 변경된다.(변수를 새로 초기화 해줄시)
<스택 메모리에서 기억해야 할 점>
1) 할당된 위치에 값만 지속적으로 변경
2) 후입선출(LIFO) 방식
3) 해제시점은 변수선언 영역을 벗어날 때
메모리의 힙(Heap) 영역은 사용자가 직접 관리할 수 있는 '관리 해야만 하는' 메모리 영역이다.
힙 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.
참조 형식의 변수를 할당 할 때, 스택(Stack)에는 메모리의 주소가 들어가게 되고, 힙에는 실질적인 값이 들어가게 된다.
스택 메모리는 함수의 호출이 종료되면 할당 된 값이 없어지지만, c#에서는 힙 메모리에 할당 된 값은 언제 없어지는지 알 수 없다.
힙 메모리는 개발자가 알아서 메모리의 할당과 해제를 처리해 주지 않으면 메모리 릭(Memory Leak)이라는 문제가 발생해서 메모리 처리에 문제가 생겼지만 JAVA와 C#의 경우에는 가비지 콜렉터(Garbage Collector)라는 녀석이 알아서 할당을 해제해 주기 때문에 개발자에게 부담을 조금 더 덜게 되었다. 하지만 GC가 있으면 성능상으로 느려지는 단점도 가지고 있다.
<힙 메모리에서 기억해야 할 점>
1) Stack에는 메모리주소가, Heap에는 실질적이 값이 들어간다.
2) 새로운 객체 변수에 기존의 변수를 할당하면 Stack의 메모리 주소만 복사된다.
3) 값을 변경하면 값은 메모리를 참조하고 있는 모든 변수의 값은 동일해 진다.