메모리 누수에 대해 공부하고 있다.
앞으로 다룰 내용들을 공부하기 전, 메모리 관리의 기초 개념인 Stack과 Heap이 무엇이고 어떻게 사용되는지 정리해보고자 한다.
머리로 알고 있는거랑 손으로 정리하는건 다른 거니까!

예를 들어 다음의 코드에서 Stack 영역이 어떻게 돌아가는지 보자.
public class Main {
public static void main(String[] args) {
int num1 = 20;
int num2 = 30;
int sum = 0;
sum = addNum(num1, num2);
System.out.println(sum);
}
public static int addNum(int n1, int n2) {
int result = n1 + n2;
return result;
}
}
먼저 Stack 영역에는 num1과 num2, sum이 메모리에 할당된다.
int num1 = 20;
int num2 = 30;
int sum = 0;

이후, sum이 addNum 함수를 호출함으로서 num1과 num2가 addNum의 인자로 넘겨지게 되고, scope는 addNum 함수로 변경된다.
scope가 변경되었기 때문에 기존의 num1, num2, sum 변수는 이용할 수 없게 된다.
그리고 n1, n2, result 역시 원시 타입인 int 이기 때문에 새로 Stack 영역에 할당된다.
sum = addNum(num1, num2);
…
public static int addNum(int n1, int n2) {
int result = n1 + n2;
return result;
}

이후 addNum 함수가 결과를 반환해 호출이 종료되면 scope가 다시 바뀌고 n1, n2, result는 Stack 영역에서 해제 된다.
sum 변수는 0으로 초기화했었지만, addNum 호출에서 사용했던 지역변수들이 메모리에서 모두 제거되기 전 재할당 되어 그 결과인 50이 되었다.

그리고 메인 함수가 종료되면, Stack에 있던 메모리들도 모두 해제되어 최종적으로 프로그램이 종료된다.
이제 Heap은 어떻게 이용되는지 Stack과 비교하여 알아보자.
Heap은 특징에서 보면 알겠지만, 메모리에 할당된 데이터를 Stack에 참조시키는 역할을 한다. 다음의 코드를 보자.
public class Main {
public static void main(String[] args) {
int age = 28;
String name = "JeongHyeYeon";
}
int는 원시 자료형이기 때문에 age 변수는 Stack에 저장되고, String은 Object 타입의 자료형이기 때문에 Heap 영역에 할당된다. 그렇기에 Stack의 name이라는 변수는 Heap 영역에 있는 String 자료형의 JeongHyeyYeon이라는 데이터를 참조하게 된다.
