You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
먼저 프로그램이 실행되면 운영체제(OS)는 메모리(RAM)에 프로그램을 위한 공간을 할당해준다.
프로그램이 운영체제로부터 할당받는 대표적인 메모리 공간은 Code, Data, Heap, Stack이 있다.
Code
코드(code) 영역은 실행할 프로그램의 코드 즉 프로그래머가 작성한 소스코드가 binary 형태로 저장되는 영역으로 텍스트(code) 영역이라고도 부름
CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리하게 됩니다.
중간에 코드가 변경되지 않도록 Read-Only의 형태로 저장된다.
Data
메모리의 데이터(data) 영역은 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역
프로그램 시작과 동시에 할당되고, 프로그램이 종료되면 메모리에서 해제된다.
실행도중 변수 값이 바뀔 수 있으니 Read-Write로 지정된다.
structKorean{
// 정적(static) 변수로 데이터 영역에 할당
staticletcountry="Korea"}
// 전역변수로 데이터 영역에 할당
varname:String?varage:Int?
Stack
스택영역은 함수의 호출과 관계되는 지역변수와 매개변수가 저장되는 영역
함수의 호출과 함께 할당되며 함수의 호출이 완료되면 소멸한다.
스택은 LIFO 방식으로 작동하므로 가장 늦게 저장된 데이터가 먼저 pop 된다.
스택 영역에 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고 한다.
스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.
스택영역은 CPU에 의해 관리되고 최적화 돼서 속도가 매우 빠르다는 장점이 있다.
funcadd(a:Int,b:Int)->Int{ // 매개변수 a, b 스택영역에 할당
letresult=a+b // 지역변수 result 스택영역에 할당
returnresult}funcsomeFunc1(c:Int){int d =30;
// 매개변수 c와 지역변수 d가 스택영역에 할당
}funcsomeFunc2(e:Int){int f =40;
// 매개변수 e와 지역변수 f가 스택영역에 할당
}
Heap
메모리의 힙(heap) 영역은 사용자가 직접 관리할 수 있는 '그리고 해야만 하는' 메모리 영역, 클래스 인스턴스(Class Instance), 클로저 같은 참조 타입의 값을 Heap에 저장함
힙 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.
사용하고 난 후에는 반드시 메모리 해제를 해줘야하지만 스위프트는 ARC를 통해 힙에 할당된 메모리가 더 이상 쓸모 없어지면(참조되지 않으면) 자동으로 해제해준다.
힙 영역은 스택과 반대로 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.
유일하게 런타임 시에 크기가 결정되기 때문에 데이터의 크기가 확실하지 않을 때 사용한다.
Stack vs Heap
위의 HEAP과 STACK영역은 사실 같은 공간을 공유한다.
HEAP이 메모리 위쪽 주소부터 할당되면 STACK은 아래쪽부터 할당되는 식이다.
그래서 각 영역이 상대 공간을 침범하는 일이 발생할 수 있는데 이를 각각 HEAP OVERFLOW, STACK OVERFLOW라고 칭한다.
Stack 영역이 크면 클 수록 Heap 영역이 작아지고, Heap 영역이 크면 클수록 Stack 영역이 작아진다.
스택영역은 CPU가 효율적으로 메모리를 구성하기에 최적화가 되어있어 속도가 빠르고 메모리를 직접 해제하지 않아도 된다.
반면 힙 영역은 메모리를 개발자가 직접 관리해야하므로 메모리 누수의 위험성이 있고 할당/해제 작업으로 인해 속도가 스택에 비해 느리다.
스택영역은 메모리 크기에 대한 제한이 있지만 힙 영역은 메모리 크기에 대한 제한이 없다.
Code & Data vs Stack & Heap
Code & Data
Code, Data 영역은 메모리 사용량에 변동이 없다. 앱이 실행되는 동안에 Xcode 상에서 작성한 코드와 변수들이 변할 일은 그냥 없다고 보면 된다. 앱이 종료될 시에 이 부분은 메모리에서 해제된다.
Stack & Heap
반대로 Stack, Heap 영역은 가변적이다. 스택이나 힙 영역이 거대해져 서로의 영역을 침범할 수 있다. 이 때 스택이 힙을 침범하는 것을 스택 오버플로우(Stack Overflow), 반대의 경우를 힙 오버플로우(Heap Overflow)라고 한다. 예를들면 for 문을 무한히 돌리게 되면 스택 오버플로우가 발생하게 될 것이고, ARC 에 의해서 관리되지 못한 강한 순환 참조와 같은 문제들로 인해서 힙 오버플로우 현상이 발생할 수 있다.