TIL/C#

[C#] 스택, 힙 메모리란 무엇인가

Sh_Blog 2023. 11. 10. 10:01

프로젝트를 하다보면 메모리에 관한 작업을 하거나 그에 관한 이해가

많이 필요한 경우가 생기곤 한다. 그래서 메모리 구조에서 스택과 힙 영역이

무엇이고 어떠한 값이 저장되는지 알아보고자 한다.

 

 

스택 메모리란?

스택 메모리란 지역변수나 매개변수(파라미터), 리턴 값 과 같은 값 형식(Value Type)이

저장되는 곳입니다. 각 스레드마다 별도의 스택이 생기는 스택 프레임 형태로 구성되어 

있고 메서드 안에 있는 값 형식들을 모두 스택프레임으로 구성하여 스택에 저장합니다.

그래서 메서드의 실행이 종료되면 해당 메서드와 관련된 모든 값 형식 데이터가 삭제됩니다.

 

힙 메모리란?

힙 메모리란 new 연산자를 사용하여 동적으로 할당되는 데이터와 객체들과 같은

참조 형식(Reference Type)이 저장되는 곳입니다. 힙에 저장된 데이터와 객체들은

가비지 컬렉션(Garbage Collection)에 의해 관리됩니다.

 

값 형식, 참조 형식 기준 설명

 

값 형식은 해당 데이터를 직접 스택 메모리에 저장하며 메서드가 종료되면

메서드에 있는 값 형식의 데이터가 삭제됩니다.

참조 형식은 힙 영역에 데이터의 형태로 저장되고 스택영역에서는 이 데이터가

저장되어 있는 메모리의 주소를 저장합니다.

 

스택과 힙메모리의 차이

 

값 형식

 

위 코드는 지역변수 즉, 값 형식의 데이터들로 구성되어 있다.

모두 스택 영역에 a = 10; b = 20;의 형태의 값으로 저장되어 있기 때문에

b = a의 경우 단순히 b의 값이 10으로 변경되고 a = 30의 경우 a의 값이

30으로 변경되는 것이다. 말 그대로 값이 실시간으로 변경되는 것이다.

그리하여 b = 10, a = 30인 결과 값이 나오게 된다.

 

참조 형식

 

여기서는 a와 b를 new를 사용하여 힙 영역에 메모리를 생성했다.

우선 Program에 있는 val를 a를 통해 접근하여 10이란 값을 넣고 있다. (a.val = 10)

그리고 여기서 중요한 부분이 b = a인데 값 형식으로 설명했을 때는 단순히

들어 갔다. 하지만 여기에선 값이 아니라 주소 값이 들어가게 된다.

그 다음 b를 통하여 val값을 접근하여 20을 넣어주고 마무리 된다.

 

그럼 a.val값은 그대로 10이고 b.val값은 20이 아닌가 생각할 수 있지만

b = a 과정에서 a의 주소값을 b에게 전달한 것이기 때문에 a와 b는 똑같은 

주소를 가지고 있다. 그리하여 b의 주소가 바라보고 있는 값 쪽에 20을 넣으면

a의 주소도 b의 주소와 같기 때문에 a도 마찬가지로 20이란 값을 동일하게 가지게 된다.

 

그래서 결과 값은 a.val = 20, b.val = 20이 나오게 된다.