메모리 구조
이번 포스팅은 Swift의 메모리 구조에 관한 내용입니다.
사실 지금까지는 메모리 관리를 신경쓰지 않고 프로젝트들을 진행했었는데,
이번 기회에 공부하여 다음부터는 해당 내용을 적용할 수 있도록 하는 것이 목표입니다.
메모리(RAM)공간은 4가지로 나뉘어져 있습니다.
코드 영역, 데이터 영역, 힙 영역, 스택 영역
다음은 4가지 공간들에 대한 특징입니다.

코드 영역
코드 영역에는 우리가 작성한 소스 코드가 기계어 형태(이진수)로 저장됩니다.
CPU는 이 곳에 저장된 명령어를 가져가서 처리합니다.
프로그램의 시작부터 종료까지 메모리에 남아있으며,
컴파일 타임에 결정되고, Read-Only 형태로 저장됩니다.
(Read-Only 형태라면 중간에 코드가 변경되지 않기 때문입니다.)
데이터 영역
데이터 영역은 전역 변수(global), static 변수가 저장되는 영역으로, 프로그램의 시작과 동시에 할당되고, 종료되면 메모리가 해제됩니다.
컴파일 타임에 결정되고, 변수들은 변경될 수 있기 때문에 Read-Write로 지정됩니다.
힙 영역
힙 영역은 동적 메모리 할당을 위한 영역으로, 프로그래머가 할당 및 해제를 해주는 영역으로,
FIFO 구조를 가져 가장 먼저 할당된 데이터가 가장 먼저 해제됩니다.
malloc, calloc 등으로 메모리를 할당할 수 있는데, 힙 영역을 사용하고 난 후에는 반드시 메모리 해제를 해줘야 합니다. 만약 메모리를 해제하지 않으면 메모리 누수(memory leak)가 발생할 수 있기 때문입니다.
하지만 iOS에서는 직접 할당하는 일은 거의 없는데, 이는 참조타입의 값(클래스 인스턴스, 클로저 등)은 힙에 자동으로 할당되기 때문입니다.
(하지만 상황에 따라 값타입 또한 할당할 수도 있습니다.)
또한 클래스를 생성한 뒤에 인스턴스를 해제하는 일도 거의 없는데,
이는 ARC가 힙에 할당된 메모리가 필요 없어지면 자동으로 해제해주기 때문입니다.
메모리 공간 중 유일하게 런타임 타임에 결정되고, 동적 할당을 위한 영역이기 때문에
데이터의 크기가 확실하지 않을 때 사용합니다.
또한 free-store라는 공간이 있는데, 해당 공간은 힙과 스택이 공유하는 공간입니다.
이 공간에서 힙 영역은 낮은 주소 → 높은 주소 방향(아래쪽 방향)으로 할당됩니다.
힙 영역의 장점은 메모리 크기에 대한 제한이 없다는 것과 범위가 전역이기 때문에 프로그램의 모든 함수에서 접근이 가능한 것이 있습니다.
하지만 단점으로는 할당 및 해제 작업, 힙손상(이중해제, 해제 후 사용 등), 힙경합(두 개 이상의 쓰레드가 동시에 접근하려 할 때)
등으로 인한 속도 저하가 발생할 수 있습니다.
또한 해제하지 않을 시 메모리 누수가 발생할 수 있기 때문에 메모리를 직접 관리해야 하는 것 또한 단점입니다.
따라서 데이터의 크기를 모르거나 스택에 저장하기에 큰 데이터인 경우에는 힙에 할당하면 됩니다.
스택 영역
스택 영역은 지역 변수, 매개 변수, 리턴값 등의 값타입이 저장되는 영역으로,
LIFO 구조를 가져 가장 먼저 생성된 변수가 가장 나중에 해제됩니다.
free-store 공간에서 스택 영역은 높은 주소 → 낮은 주소 방향(위쪽)으로 메모리가 할당되고,
이 영역에 할당된 변수는 함수 호출이 완료되면 사라집니다.
컴파일 타임에 크기가 결정되기 때문에 크기를 무한히 할당할 수 없습니다.
스택은 프로그램이 자동으로 사용하는 임시 메모리 영역으로,
CPU에 의해 관리되고 최적화가 이루어져 속도가 매우 빠릅니다.
또한 변수들은 함수 호출이 완료되면 사라지기 때문에 메모리를 직접 해제할 필요도 없습니다.
하지만 메모리 크기에 제한이 있다는 점과 지역 변수만 접근 가능하다는 단점이 있습니다.
'Swift' 카테고리의 다른 글
[Swift] 클래스와 프로토콜에 대한 고찰 및 사용 기준 (0) | 2025.01.23 |
---|---|
[Swift] 스위프트 - Character를 Int로 변환 (wholeNumberValue) (0) | 2024.01.01 |
[Swift] 스위프트 - 배열에 있는 문자와 문자열 간단하게 출력하기 (String, joined, sorted) (0) | 2024.01.01 |
[Swift] 스위프트에서의 ,와 &&의 차이점 (2) | 2023.12.28 |
[Swift] Swift API Design Guidelines 요약 및 정리 (0) | 2023.08.14 |
메모리 구조
이번 포스팅은 Swift의 메모리 구조에 관한 내용입니다.
사실 지금까지는 메모리 관리를 신경쓰지 않고 프로젝트들을 진행했었는데,
이번 기회에 공부하여 다음부터는 해당 내용을 적용할 수 있도록 하는 것이 목표입니다.
메모리(RAM)공간은 4가지로 나뉘어져 있습니다.
코드 영역, 데이터 영역, 힙 영역, 스택 영역
다음은 4가지 공간들에 대한 특징입니다.

코드 영역
코드 영역에는 우리가 작성한 소스 코드가 기계어 형태(이진수)로 저장됩니다.
CPU는 이 곳에 저장된 명령어를 가져가서 처리합니다.
프로그램의 시작부터 종료까지 메모리에 남아있으며,
컴파일 타임에 결정되고, Read-Only 형태로 저장됩니다.
(Read-Only 형태라면 중간에 코드가 변경되지 않기 때문입니다.)
데이터 영역
데이터 영역은 전역 변수(global), static 변수가 저장되는 영역으로, 프로그램의 시작과 동시에 할당되고, 종료되면 메모리가 해제됩니다.
컴파일 타임에 결정되고, 변수들은 변경될 수 있기 때문에 Read-Write로 지정됩니다.
힙 영역
힙 영역은 동적 메모리 할당을 위한 영역으로, 프로그래머가 할당 및 해제를 해주는 영역으로,
FIFO 구조를 가져 가장 먼저 할당된 데이터가 가장 먼저 해제됩니다.
malloc, calloc 등으로 메모리를 할당할 수 있는데, 힙 영역을 사용하고 난 후에는 반드시 메모리 해제를 해줘야 합니다. 만약 메모리를 해제하지 않으면 메모리 누수(memory leak)가 발생할 수 있기 때문입니다.
하지만 iOS에서는 직접 할당하는 일은 거의 없는데, 이는 참조타입의 값(클래스 인스턴스, 클로저 등)은 힙에 자동으로 할당되기 때문입니다.
(하지만 상황에 따라 값타입 또한 할당할 수도 있습니다.)
또한 클래스를 생성한 뒤에 인스턴스를 해제하는 일도 거의 없는데,
이는 ARC가 힙에 할당된 메모리가 필요 없어지면 자동으로 해제해주기 때문입니다.
메모리 공간 중 유일하게 런타임 타임에 결정되고, 동적 할당을 위한 영역이기 때문에
데이터의 크기가 확실하지 않을 때 사용합니다.
또한 free-store라는 공간이 있는데, 해당 공간은 힙과 스택이 공유하는 공간입니다.
이 공간에서 힙 영역은 낮은 주소 → 높은 주소 방향(아래쪽 방향)으로 할당됩니다.
힙 영역의 장점은 메모리 크기에 대한 제한이 없다는 것과 범위가 전역이기 때문에 프로그램의 모든 함수에서 접근이 가능한 것이 있습니다.
하지만 단점으로는 할당 및 해제 작업, 힙손상(이중해제, 해제 후 사용 등), 힙경합(두 개 이상의 쓰레드가 동시에 접근하려 할 때)
등으로 인한 속도 저하가 발생할 수 있습니다.
또한 해제하지 않을 시 메모리 누수가 발생할 수 있기 때문에 메모리를 직접 관리해야 하는 것 또한 단점입니다.
따라서 데이터의 크기를 모르거나 스택에 저장하기에 큰 데이터인 경우에는 힙에 할당하면 됩니다.
스택 영역
스택 영역은 지역 변수, 매개 변수, 리턴값 등의 값타입이 저장되는 영역으로,
LIFO 구조를 가져 가장 먼저 생성된 변수가 가장 나중에 해제됩니다.
free-store 공간에서 스택 영역은 높은 주소 → 낮은 주소 방향(위쪽)으로 메모리가 할당되고,
이 영역에 할당된 변수는 함수 호출이 완료되면 사라집니다.
컴파일 타임에 크기가 결정되기 때문에 크기를 무한히 할당할 수 없습니다.
스택은 프로그램이 자동으로 사용하는 임시 메모리 영역으로,
CPU에 의해 관리되고 최적화가 이루어져 속도가 매우 빠릅니다.
또한 변수들은 함수 호출이 완료되면 사라지기 때문에 메모리를 직접 해제할 필요도 없습니다.
하지만 메모리 크기에 제한이 있다는 점과 지역 변수만 접근 가능하다는 단점이 있습니다.
'Swift' 카테고리의 다른 글
[Swift] 클래스와 프로토콜에 대한 고찰 및 사용 기준 (0) | 2025.01.23 |
---|---|
[Swift] 스위프트 - Character를 Int로 변환 (wholeNumberValue) (0) | 2024.01.01 |
[Swift] 스위프트 - 배열에 있는 문자와 문자열 간단하게 출력하기 (String, joined, sorted) (0) | 2024.01.01 |
[Swift] 스위프트에서의 ,와 &&의 차이점 (2) | 2023.12.28 |
[Swift] Swift API Design Guidelines 요약 및 정리 (0) | 2023.08.14 |