컴파일 타임에 결정되고 중간에 코드가 변경되는 일이 없도록 Read-Only 형태로 저장된다
Data
전역변수와 static 변수들이 저장되는 공간
보통의 경우엔 프로그램 시작과 동시에 할당되며 프로그램이 종료되어야 해제된다
하지만 Swift에서의 static은 lazy이기 때문에 아마 접근 시 할당되고 앱이 종료시 해제 될 것이다.
실행 도중에 변수 값이 변경될 수 있기 때문에Read-Write형태로 저장된다.
Stack
함수 호출 시 함수의 지역변수, 매개변수, 리턴값 등이 저장되는 공간.
컴파일 시점에 결정되고 함수가 종료되면 할당된 메모리도 해제 된다.
장점
CPU가 메모리를 효율적으로 구성하기 때문에 속도가 매우 빠름
메모리르 직접 관리 하지 않는다.
단점
메모리 크기에 대한 제한
지역 변수만 액세스 가능
Heap
프로그래머가 동적할당/해제 하는 메모리 공간
사용하고 난 후에는 반드시 메모리 해제를 해주어야memory leak이 발생하지 않는다.
네 영역중 유일하게 런타임 시에 결정되기 때문에 데이터의 크기가 확실하지 않을 때 사용
하지만 swift에서는 ARC를 채택하기 때문에 클래스의 인스턴스 클로저와 같은 참조 타입을 자동으로 Heap에 할당과 해제를 해준다.
장점
메모리 크기에 대한 제한이 없다.
범위가 전역이기 때문에 프로그램의 모든 함수에서 액세스 가능
단점
할당/해제 힙 손상, 경합 등 으로 인한 속도 저하
메모리를 직접 관리해야 함 해제 하지 않을 시memory leak이 발
💡 스택과 힙 힙과 스택은 같은 메모리 공간을 공유 하는데 힙은 낮은 메모리 주소부터 할당을 받고 스택은 높은 메모리 주소 부터 할당을 받는다. 여기서 힙이 너무 많은 메모리를 할당하여 자신의 메모리 영역을 초과한 경우를 힙 오버플로우 반대로 스택이 너무 많은 메모리를 할당하여 자신의 메모리 영역을 초과한 경우를 스택 오버플로우 라고 한다
Swift에서의 Value Type, Reference Type
Value Type
Swift의 기본 자료형 타입 (Int, Float, Double, Bool, String, Array, Dictionary, Set 등)은 모두 struct 형태로 구현
struct, enum, tuple 등
Reference Type
class, function, clouser 등
Swift에의 Collection은 Value Type이면서 Reference Type
우리는 이제 Value Type은 스택에 Reference Type은 힙에 저장된다는 것을 알고 있습니다.
하지만 Collection타입의 서브타입들 (String, Array, Dictionary 등)은 기본적으론 Value Type이지만
내부 구현을 보면 둘이 섞여 있습니다. 그 이유는 성능 때문인데요
Array나 String은 크기가 큰 값들을 내부에 포함하고 있는 경우가 많습니다. 하지만 이것들은 값타입이라