프로젝트를 하다보면 메모리에 관한 작업을 하거나 그에 관한 이해가
많이 필요한 경우가 생기곤 한다. 그래서 메모리 구조에서 스택과 힙 영역이
무엇이고 어떠한 값이 저장되는지 알아보고자 한다.
스택 메모리란?
스택 메모리란 지역변수나 매개변수(파라미터), 리턴 값 과 같은 값 형식(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이 나오게 된다.
'TIL > C#' 카테고리의 다른 글
[C#] 오버로딩과 오버라이딩 (0) | 2023.11.14 |
---|---|
[C#] 객체지향 (OOP, SOLID) (0) | 2023.11.13 |
[C#] 정렬 알고리즘 (선택 정렬, 버블 정렬) (0) | 2023.11.09 |
[C#] Callback은 무엇인가? (0) | 2023.11.08 |
[C#] 델리게이트 (0) | 2023.11.06 |