5. Stack과 Heap
C#/과제 2019. 3. 25. 00:57Memory는 Text, Data, BSS, Heap, Stack으로 구성된다.
1. Stack이란?
Stack은 데이터가 Method가 실행되고서 부터 하나씩 차례대로 저장하는 구조이다.
하나 하나 쌓이다가 나중에 들어온 데이터가 가장 먼저 나가는 'LIFO(Last In First Out)' 구조이다.
이는 우리가 문서를 PC로 작성하다가 쓰는 단축키를 예로 들면 쉽게 이해가 된다.
Ctrl+Z를 하면 바로 이전 단계로 되돌아가는데 이처럼 마지막에 실행된 값이 가장 먼저 나가는 구조이다.
PUSH를 통하여 값을 쌓고, POP을 통하여 값을 꺼내 지운다.
즉, 우리가 작성한 Method가 실행될 때 변수가 Stack에 PUSH되고, Method가 return을 함으로서 종료될때 POP이 되는 것이다.
예를 들어 위와 같은 코드에서는 Main에서 ABC개체의 sum이라는 Method에 10과 20을 보낸다.
Method를 호출함과 동시에 스택에는 a=10; b=20;이 저장되고,
return a + b;를 통하여 30을 리턴함과 동시에 스택은 비워지게 된다.
2. Heap이란?
우리가 흔히 동적할당, 즉 new나 malloc을 통하여 메모리를 할당할 때 사용하는 메모리 공간이다.
Heap은 참조형식의 데이터타입 변수들이 가리키는 곳으로 이 곳에 저장되는 데이터들은 다른 참조형식의 변수가 접근할 수 있다.
그 누구도 메모리를 가리키지 않을 때 메모리할당을 해제하거나 하기 때문에, 수동적으로 메모리 할당을 해제하여 주는 것이 좋다.
주소를 참조하는 변수를 이용하여 접근하기 때문에 액세스 속도가 Stack에 비해 떨어지지만,
Method가 소멸할 때 같이 소멸하는 Stack과는 달리 Method와 관계없이 존재하기 때문에 어느 지점에서든 접근할 수 있는 것이 장점이다.
즉, 전역변수가 존재하는 구역이라고 생각하면 된다.
위의 예제와 같은 것인데 Main부분을 보면, new calcul();이라는 곳이 보인다.
이를 통하여 Heap공간에 calcul개체 하나만큼의 공간을 할당하고 개체를 생성한다는 뜻이다.
ABC는 참조형식의 변수이므로 그 할당한 개체의 주소를 참조하고 있기 때문에 sum이라는 Method를 불러올 수 있는 것이다.
하지만 ABC는 Stack에 저장되므로, 만약 Main이 아닌 다른 Method에 위치했을 경우에는 그 Method가 소멸할 때 ABC도 소멸한다.
그렇게 될 경우 new calcul();을 가리키는 변수가 없으므로 메모리는 의미없이 누수되는 것이다.
참조
시스템 해킹 강좌 5강 메모리 구조 이해하기 (동빈나)
https://www.youtube.com/watch?v=TxWOaKE5w_s
.NET Stack and Heap (Wallace Kelly)
https://www.youtube.com/watch?v=clOUdVDDzIM
Pointers and dynamic memory - stack vs heap (mycodeschool)
https://www.youtube.com/watch?v=_8-ht2AKyH4
C# Heap(int) Vs Stack(ing) In .NET - Part One (Metthew Cochran)
https://www.c-sharpcorner.com/article/C-Sharp-heaping-vs-stacking-in-net-part-i/
'C# > 과제' 카테고리의 다른 글
7. 형식변환 (0) | 2019.03.26 |
---|---|
6. using (0) | 2019.03.26 |
4. 문자열 표현식 (0) | 2019.03.25 |
3. 데이터의 값형식과 참조형식 (0) | 2019.03.25 |
2. 몬스터 공격 예제[3단계] (0) | 2019.03.24 |