본문 바로가기
CS/Computer Basic

[CS/Basic] 메모리 관리의 시작, ARC(Automatic Reference Counting)

by iosdevlime 2023. 3. 16.

Heap과 Stack에 대해 어느정도 이해가 되셨다고 하신다면..

이번 포스팅에서는 Swift에서 어떻게 메모리를 관리를 하는지 살펴보고자 합니다.

 

면접 단골 질문 중 하나인,

ARC(Automatic Reference Counting)에 대해 알아보기에 앞서

RC란 무엇이고, 

 

(ARC의 구체적인 메모리 관리 과정은 다음 포스팅에서 이어집니다)

 

 

 


 

 

 

Heap과 RC(Reference Counting)의 관계

RC란, Heap 영역에 저장되는 데이터의 효율적인 관리를 위한 일종의 '참조 카운팅' 시스템

 

앞선 포스팅에서 살펴본 Heap에 대해 간단하게 정리하고 넘어가자면..

  • 개발자, 사용자에 의해 할당하며, 해제되는 관리 가능한 영역
  • 클래스 인스턴스(Class Instance)나 클로저와 같은 '참조타입' 값이 저장
  • 데이터 크기가 확실하지 않으므로, 4개 영역 중 유일하게 런타임 시 할당

정리하자면, 데이터가 메모리에 저장되고 해제되는 전반적인 과정을

'개발자' 혹은 무언가의 장치를 통한 관리가 필요하다는 의미와 같습니다.

 

여기서, 이러한 역할을 담당하는 것이 바로 'RC(Reference Counting)' 입니다.

 

 

 

RC(Reference Counting)란?

  • 저장된 데이터가 자동적으로 제거되는 Stack과는 달리, Heap은 개발자의 손길이 필요합니다.
    • Heap은 동적으로 할당하는 메모리 공간이므로, 필요 없는 메모리에 대한 관리가 필요합니다,
  • RC는 Heap 영역의 메모리의 관리를 위한 유용한 도구입니다.
    • 클래스 인스턴스, 클로저 등 참조타입 값이 저장될 때 마다 증가하는, 일종의 '카운트'시스템입니다.
    • 해당 카운터를 활용, Heap 메모리에 저장된 필요하지 않은 데이터를 추적하고, 해제합니다. 

 

GC(Garbage Collection)과 RC(Reference Counting)간의 비교

  • GC(Garbage Collection)이란, JAVA에서 활용하는 Heap 메모리 관리 방식입니다.
    • Heap 메모리 영역의 leak을 추적, 해당 인스턴스를 직접 해제하는 과정을 거치게 됩니다.
    • Runtime(프로그램 실행) 단계에서 실행되므로, 추가적인 리소스가 발생한다는 단점이 있습니다.
      (지속적으로 감시를 하기 위한 메모리를 사용하게 됨)
  • 반면에, RC는 Compile 단계에서 언제 참조되고, 해제되는지 결정하는 방식을 취합니다.
    • 즉, 개발자가 참조 해제시점을 파악할 수 있으며 GC와는 달리 추가 리소스가 발생하지 않습니다.
    • 다만, '순환 참조'가 발생할 경우 앱을 삭제하기 전까지 메모리가 해제되지 않을 수 있습니다.

 


 

 

MRC vs ARC

컴파일러에 의한 RC(Reference Counting)의 자동화

 

RC의 역할과 기능에 대해 이해가 되셨다면,

얼추 'ARC'란 관리 모델에 대해 유추하실 수 있으시겠지요?

 

Auto Reference Counting, 

RC를 컴파일러가 알아서 메모리 관리코드를 실행하는 매우 유용한 도구라고 볼 수 있습니다!

 

그 전에,

ARC가 등장하기 이전엔 어떤 방식으로 메모리 관리를 수행했을까요?

 

 

과거 - MRC(Manual Reference Counting)

  • MRC는 Objective-C가 주 언어로 활용되던 iOS 초창기에 활용했던 메모리 관리 모델입니다.
    • 특정 인스턴스의 기본 메서드인 'reatain', 'release' 를 호출하는 방식을 활용했습니다.
    • 개발자가 직접 작성해야 한다는 불편함과 프로그램 안정성 문제가 계속 발생했습니다.
  • WWDC 2011이후 등장한 ARC를 사용하게 되며 MRC는 역사의 뒤안길로 사라졌습니다.
    • 특히나, Swift의 경우 ARC 메모리 관리 모델만 사용 가능하다는 특징이 있습니다.

 

현재 - ARC(Automatic Reference Counting)

  • ARC는, 컴파일러가 알아서 메모리 관리 코드를 삽입하는 관리 모델입니다.
    • 따라서, MRC와는 달리 코드의 양은 점차 적어지고, 프로그램의 안정성은 개선되었습니다.
  • 💡ARC는 컴파일 시점에 실행된다는데, 런타임 시점에 저장되는 Heap에서 어떻게 관리되나요?
    •  
    • 아래 그림과 같이 컴파일 시점자동으로 retain, release를 적절하게 위치시킵니다!
    • 따라서, 삽입된 코드는 런타임 시점에 실행되는 동시에 RC 기능을 수행할 수 있게 됩니다. 

 

MRC와 ARC 메모리 관리모델 비교
MRC와 ARC 메모리 관리모델 비교

 

 


 

이번 포스팅에서는

ARC의 전반적인 개념을 살펴보기 위해

 

RC(Reference Counting)의 개념과 GC(Garbage Collection)와의 비교,

과거에 활용했던 MRC에 대해 알아보았습니다.

 

이어서, 다음 포스팅에서는 ARC의 메모리 관리 과정을 예시코드와 함께 다뤄보겠습니다. 

댓글