이번에 알아 볼것은 Stack
,Heap
메모리란 무엇인지, 또 각 메모리 영역에는 어떤 값들이 저장되는지 알아보겠습니다.
Stack 메모리는 함수의 호출과 관계되는 지역변수와 매개변수가 저장된 영역입니다. 스택 영역은 함수의 호출과 함께 할당되고, 함수의 호출이 완료되면 소멸합니다. 또한 스택 영역에는 원시타입(Primitive
) 변수들이 할당되는 영역입니다.
힙(Heap) 메모리 영역은 프로그램에서 동적으로 할당되는 메모리를 관리하는데 사용되는 영역입니다. 스택은 지역 변수, 함수 호출시 생성되는 변수, 원시타입 변수들을 저장하는 영역이라면, 힙은 그외의 동적으로 메모리를 저장하는 영역입니다.
원시타입
은 정수, 실수, 문자(char), 논리형(boolean)등, 실제 데이터 값을 저장하는 타입을 말합니다.
예시
참조타입
은 객체의 참조(주소)를 저장하는 타입으로, 주소 값을 통해 객체를 참조하고 있는 타입을 말합니다.
예시
즉, int
, double
, boolean
등이 스택에 저장되고 타입들을 제외한 문자열, 열거(enum), 클래스, 인퍼페이스, 배열타입들이 힙에 저장되는 것입니다.
함수 호출, 원시타입 변수를 생성시 스택에 어떻게 저장이 되는지 알아봅시다.
fun addNumber(num1:Int, num2:Int) => num1+num2
val integer = 123
val character = 'a'
val bool = true
val result = addNumber(1,2)
위와 같은 코드를 작성했을때 스택에 메모리가 저장되는 방법은 다음과 같습니다.
변수 integer
가 가장 먼저 선언되었으니 스택에 맨 아래에 위치하게 되고 그다음으로 character
변수, 그리고 bool
변수가 차례로 저장 되었습니다. 그 다음으로는 addNumber
함수가 호출 되었는데, 함수가 호출된 경우에는 매개변수, 반환값의 주소, 지역 변수 순으로 스택에 저장됩니다. 이때 addNumber
함수의 매개변수는 원시타입이기 때문에, 스택에 값이 저장됩니다.
그다음 함수가 종료 되면 addNumber
함수의 스택 프레임이 소멸되고, bool
-> character
-> integer
순으로 메모리에서 사라집니다.
이번에는 힙에 어떻게 저장되는지 알아봅시다.
class Person()
val list = mutableListOf(1,2,3)
val person = Person()
예를 들어 Person
이라는 클래스와 list
이라는 리스트를 생성했을때 힙과 스택 메모리에 다음과 같이 저장됩니다.
Person
과 List
는 원시타입이 아니기 때문에 스택에 값이 저장되지 않고 힙에 저장되며, 스택에는 힙의 메모리 참조(주소값) 이 저장됩니다.
그래서 변수 사용이 끝나 스택에서 참조가 사라져도 힙에 객체가 남아 있을 경우 메모리 누수의 원인이 되기 때문에 가비지 컬렉터(Garbage Collector)일면 GC가 힙의 메모리 할당을 해제해주는 역할을 합니다.