[TIL] 메모리와 ARC

신승현·2024년 4월 11일

TIL

목록 보기
56/72
post-thumbnail

1️⃣ Swift 메모리의 구조

Swift에서 메모리는 크게 4가지의 영역(코드, 데이터, 힙, 스택)으로 나눌 수 있다고 한다.

1. 코드(Code) 영역

  • 코드 영역은 프로그램의 실행 코드가 저장되는 공간이며, 컴파일된 소스 코드와 프로그램의 명령어들이 저장된다.
  • 이 영역은 읽기 전용이며, 프로그램이 실행되면서 수정되지 않는다.

2. 데이터(Data) 영역

  • 데이터 영역은 전역 변수와 정적 변수, 상수가 저장되는 곳이며, 프로그램 시작 시 할당되고 프로그램이 종료될 때까지 유지되는 영역이다.

3. 힙(Heap) 영역

  • 힙 영역은 프로그램 실행 중에 동적으로 할당된 데이터가 저장되는 곳이다.
  • 힙은 런타임 중에 메모리 할당이 필요한 경우 사용되며, 개발자가 직접 제어할 수 있다.
  • 힙에 저장된 데이터는 직접적으로 포인터를 통해 접근(참조)된다.
  • 힙은 스택과 달리 메모리의 자유 공간을 사용하여 데이터를 저장하므로, 크기나 수명에 대한 동적인 요구에 대응할 수 있다.
  • 참조타입(reference Type)이 저장되는 영역 => Class

4. 스택(Stack) 영역

  • 소스코드가 컴파일러에 의해 기계어로 변환되는 시점(컴파일 타임)에 크기가 결정되며, 스택 영역은 함수 호출과 관련된 정보를 저장하는 데 사용된다.
  • 함수가 호출될 때마다 해당 함수의 로컬 변수, 함수 매개변수, 반환 주소 그리고 함수 호출에 필요한 기타 정보가 스택에 저장된다.
  • 함수가 실행을 마치면 해당 함수와 관련된 데이터가 스택에서 제거된다.
  • 스택은 후입선출(Last-In-First-Out, LIFO) 구조를 가지고 있다.
  • 값타입(value Type)이 저장되는 영역 => Struct, enum

2️⃣ ARC 란?

✅ ARC 란? : Automatic Reference Counting의 약자이다.

  • Swift는 ARC를 사용하여 힙 영역의 객체 메모리를 자동으로 관리해준다.

  • ARC는 힙 영역의 객체에 대한 강한 참조의 count를 추적하고, 객체가 더 이상 필요하지 않을 때(참조된 count가 없을 때) 해당 객체에 대한 메모리를 자동으로 해제하는 방식으로 메모리를 관리한다.

👉 Strong Reference (강한 참조)

  • 기본적으로 Swift에서 변수나 상수는 Strong Reference(강한 참조)이다.
  • 객체에 대한 Strong Reference(강한 참조) count가 증가되어 있다면, 해당 객체는 메모리에 유지되는 형식이다.

👉 Circular References (순환 참조)

  • ARC 작동 방식의 특성상 두 객체가 서로를 강하게 참조하는 경우, 순환참조가 발생하게 된다.

  • 두 객체 모두 더이상 사용되지 않더라도 두 객체가 서로를 강하게 참조하는 경우, Strong Reference count가 감소하지 않아, 메모리에서 해제되지 못하고 메모리가 누수되는 문제가 발생하게 된다.

  • 이러한 문제를 해결하기 위해, 약한 참조(weak reference)와 미소유 참조(unowned reference)를 사용한다.

    1. Weak Reference (약한 참조)

    • 약한 참조는 Strong Reference(강한 참조)와는 달리 객체의 참조 count를 증가 시키지 않는다.
    • 객체의 생명 주기에 영향을 주지 않으면서 참조를 유지할 수 있다.

    2. Unowned Reference (미소유 참조)

    • 미소유 참조는 약한 참조와 유사하지만, optional 값이 아니라서, nil로 설정될 수 없다.
    • 만일 참조하는 객체가 이미 메모리에서 해제된 상태에서 접근하려 하면 runtime error가 발생되기 때문에, 사용 시점에 객체가 이미 해제되지 않았다고 확신할 수 있는 경우에 사용해야 한다.
profile
개발자

0개의 댓글