프로그램이 실행되는 동안 메모리는 여러 영역으로 나뉜다.
메모리 영역은 프로그램의 데이터와 코드, 실행 중인 프로그램의 상태 등을 저장하고 관리하는 데 사용된다.
<br>
## 일반적인 메모리 영역
1. **코드 영역 (Text 영역):**
- **실행 가능한 프로그램의 명령어**들이 저장되는 영역. 프로그램이 실행될 때 CPU가 이 영역의 명령어를 읽어서 실행한다. 이 영역은 읽기 전용이며, 프로그램이 로드될 때 메모리에 적재된다.
2. **데이터 영역**
- **전역 변수와 static 변수**가 저장되는 영역. 이는 프로그램의 시작과 함께 할당되며, **프로그램이 종료될 때까지 유지된다.** (프로그램 실행 동안만 유지되는 데이터)
3. **힙 (Heap):**
- **동적으로 할당된 메모리**가 저장되는 영역. 프로그램 실행 중에 필요에 따라 메모리를 동적으로 할당하고 해제할 수 있다. 힙은 **개발자가 직접 메모리를 할당하고 해제할 수 있는 영역**으로, 일반적으로 동적으로 생성된 객체와 데이터 구조가 여기에 저장된다.
```
힙 메모리는 개발자가 직접 관리해야 하는데, 이는 할당된 메모리를 올바르게 해제해야 하고, 해제된 메모리를 더 이상 참조하지 않도록 주의해야 함을 의미한다. 메모리 누수나 잘못된 메모리 접근을 주의하자..
```
4. **스택 (Stack):**
- 함수 호출과 지역 변수가 저장되는 영역. 각 함수가 호출될 때마다 해당 함수에 필요한 지역 변수와 매개변수가 스택에 할당되며, 함수가 종료되면 스택에서 제거된다.
```
프레임 포인터 (Frame Pointer)
함수 호출과 관련된 메모리 영역을 지정하고, 함수 내의 지역 변수 및 매개변수에 접근하기 위한 목적으로 사용되는 레지스터 또는 메모리 위치를 가리키는 포인터. 프레임 포인터는 함수 호출 스택 프레임(Stack Frame)의 시작 주소를 가리키며, 이를 통해 함수의 지역 변수 및 매개변수에 접근할 수 있다.
```
<br>
<br>
메모리 관리는 프로그래밍 언어 및 실행 환경에 따라 다르다.
<br>
<br>
## 힙 메모리와 스택 메모리의 차이점
1. **할당 방법:**
- **힙 메모리:** 동적으로 할당되는 데이터가 주로 힙 메모리에 저장된다. 프로그램 실행 중에 런타임에 할당되며, 개발자가 메모리를 명시적으로 할당하고 해제해야 한다.
- **스택:** 정적으로 할당되는 데이터가 주로 스택에 저장된다. 함수 호출이나 지역 변수와 같이 프로그램의 실행 흐름에 따라 자동으로 할당되고 해제된다.
2. **데이터의 생존 기간:**
- **힙 메모리:** 데이터는 개발자가 명시적으로 메모리를 할당하고 해제하기 때문에, 데이터의 생존 기간은 **개발자가 의도한 바에 따라** 결정된다. 메모리를 해제하지 않으면 메모리 누수가 발생할 수 있다.
- **스택:** 데이터의 생존 기간은 해당 데이터가 스택 프레임 안에 존재하는 동안에만 유효하다. 함수가 종료되면 해당 함수에서 사용된 지역 변수는 **자동으로 해제된다.**
3. **접근 속도:**
- **힙 메모리:** **포인터를 통한 간접적인 접근**이 필요하며, 동적 할당과 해제의 오버헤드가 있을 수 있다.
- **스택:** 지역 변수의 접근은 **매우 빠르며**, 메모리 할당과 해제가 자동으로 이루어지므로 오버헤드가 적다.
4. **크기 제한:**
- **힙 메모리:** 힙 메모리는 상대적으로 **큰 데이터**를 저장하는 데 유용하며, 동적으로 크기가 조정될 수 있다.
- **스택:** 스택은 주로 상대적으로 작은 크기의 지역 변수 및 함수 호출 정보를 저장하는 데 사용되며, 크기는 **컴파일 시점**에 결정된다.
<br>
<br>
## Swift에서의 메모리 ✨
1. **힙 메모리:**
- Swift에서 힙 메모리는 주로 클래스 인스턴스와 클로저 같은 참조 타입에 사용된다. 클래스 인스턴스는 `class` 키워드를 사용하여 생성되고, 힙 메모리에 동적으로 할당된다.
- 참조 타입은 [[ARC 이해하기|ARC(Automatic Reference Counting)]]라고 불리는 메모리 관리 기술을 사용한다. ARC는 객체의 참조 횟수를 추적하여 객체가 더 이상 필요하지 않을 때 자동으로 메모리를 해제하는 기술이다.
2. **스택:**
- Swift에서 스택은 주로 값 타입(예: 구조체, 열거형, 기본 데이터 타입)에 사용된다. 값 타입은 스택에 직접 저장되며, 해당 값의 복사본이 전달된다.
- 함수 호출 시 지역 변수도 스택에 할당되고, 함수가 종료되면 자동으로 스택에서 해제된다.
3. **자동 메모리 관리:**
- Swift는 ARC를 통해 힙 메모리의 관리를 자동으로 수행한다. 개발자는 일반적으로 메모리 할당과 해제를 명시적으로 다룰 필요가 없다. (고마워요 Swift\~~)
4. **옵셔널 타입:**
- Swift에서는 옵셔널 타입을 사용하여 값이 없을 수 있는 상황을 다룬다. 이는 `nil` 값을 표현할 수 있다.
- **옵셔널 타입은 힙 메모리에 저장되며, ARC를 통해 자동으로 관리된다.**
<br>
Swift에서는 개발자가 명시적으로 메모리를 할당하고 해제하는 경우가 적고, 대부분의 경우에는 ARC가 메모리 관리를 자동으로 처리한다. 이로써 메모리 누수나 다른 관련된 문제들을 감소시킬 수 있다.
<br><br>
Swift 깐깐한 네가 좋다..
![[하트 준하명수.jpeg|150]]
<br>
<br>
<br>
<br>