Stack 영역
- LIFO(Last in, First out) 방식으로 데이터가 저장된다.
- 할당과 해제가 자동으로 이루어진다.
- 값 타입을 저장한다.
- 수명이 짧은 편이다. (함수가 return되는 즉시, 모든 지역변수가 pop된다!)
- 실행할 수 없다. (누군가가 Stack에 코드를 써넣을 수도 있다. 이게 해킹 수단이 될 수도 있다!)
- 높은 주소 -> 낮은 주소 순으로 할당된다.
Heap 영역
- 프로그래머가 직접 할당과 해제를 해야 한다.
- 참조 타입을 저장한다.
- 실행할 수 없다. (마찬가지로 Heap에도 코드를 주입할 수 있기 때문)
- 낮은 주소 -> 높은 주소 순으로 할당된다.
여기서 값 타입이란? 변수에 값을 저장하는 타입을 뜻한다. 이는 두 가지 특징을 지니는데;
- 다른 변수에 할당하거나 함수로 전달하는 경우, 값이 복사된다.
- 복사되기 때문에 원본 값이 변경되지 않는다.
여기서 참조 타입이란? 주소를 저장하는 타입을 뜻한다. 이는 두 가지 특징을 지니는데;
- 다른 변수에 할당하거나 함수로 전달하는 경우, 같은 객체를 참조한다.
- 한쪽에서 데이터를 변경하면, 모두가 영향을 받는다.