콘텐츠로 바로가기

Swift Runtime & ARC Mechanics

Swift 런타임 및 ARC 메커니즘의 정의, 범위, 선행 지식, 학습 주제, 참고 근거를 정리한 CS&E 학습 노드입니다.

목차 보기20

1. Overview

Swift 런타임 및 ARC 메커니즘(Swift Runtime & ARC Mechanics)은 Apple 생태계의 심장인 Swift 언어가 메모리를 어떻게 할당하고 해제하는지, 그리고 객체의 생명주기를 물리적으로 통제하는 핵심 역학을 다룹니다.

가비지 컬렉터(GC)가 주기적으로 멈춰서(Stop-the-world) 메모리를 청소하는 자바(Java)와 달리, Swift는 컴파일 시점에 참조 횟수 증감(Retain/Release) 코드를 정확한 위치에 박아넣는 자동 참조 계수(ARC: Automatic Reference Counting) 방식을 사용합니다. 학습자는 강한 순환 참조(Strong Reference Cycle)가 발생했을 때 메모리 누수(Leak)가 생기는 물리적 원인을 파악하고, weak와 unowned 키워드를 통해 메모리 참조 그래프의 순환 고리를 끊어내는 정밀한 수술 기법을 익힙니다. 나아가 정적/동적 디스패치(Dispatch) 메커니즘을 통해 런타임 성능을 극대화하는 컴파일러 물리학을 다룹니다.

2. Scope & Boundaries

In-Scope

  • ARC 메모리 관리: 자동 참조 계수(Retain/Release), 강한/약한/미소유(Strong/Weak/Unowned) 참조, 메모리 누수 탐지.
  • 메서드 디스패치(Method Dispatch): 정적(Static/Direct) 디스패치, 동적(Dynamic/Table) 디스패치, 메시지 디스패치(Message Dispatch).
  • 값 타입과 참조 타입: Struct vs Class, Copy-on-Write(CoW) 최적화 물리.
  • Swift 런타임(Runtime): 옵셔널 바인딩(Optional Binding), 프로토콜 지향 프로그래밍(POP)의 런타임 오버헤드.

Out-of-Scope

  • UI 렌더링 프레임워크: UIKit이나 SwiftUI 화면을 어떻게 그리는가 ightarrow ightarrow 13-01-02. UIKit vs SwiftUI Rendering Physics 영역으로 위임.
  • 비동기 스레드 관리: GCD와 Swift Concurrency(async/await) ightarrow ightarrow 13-01-03. iOS Concurrency & Actors Physics 영역으로 위임.

Boundaries

  • Swift vs Kotlin(13-02-01): Kotlin은 JVM 위에서 GC(Garbage Collection)가 메모리를 치우는 런타임 기반 방어체계지만, Swift ARC는 컴파일러가 조립 라인에서 미리 쓰레기통을 설계하는 정적 컴파일 물리라는 점에서 결정적인 차이가 있습니다.

3. Counterexample

  • 순환 참조의 맹신 (Retain Cycle Fallacy): 두 개의 클래스 객체(예: 부모 뷰와 자식 뷰)가 서로를 strong 변수로 꽉 쥐고 놓지 않는 상황. ARC 환경에서는 둘 다 영원히 해제되지 않아 앱이 튕기는 크래시(OOM: Out of Memory)로 직결됩니다. 반드시 한쪽의 연결 고리를 weak로 끊어주어 참조 그래프를 단방향으로 만들어야 합니다.
  • 무분별한 참조 타입 사용 (Reference Type Abuse): C++나 Java에 익숙한 개발자가 Swift에서도 모든 데이터를 Class로 떡칠하는 현상. Swift는 Struct(값 타입) 기반의 언어이며, 데이터를 힙(Heap)이 아닌 스택(Stack)에 할당하여 GC의 부담 없이 즉각적으로 할당/해제하는 것이 성능 최적화의 핵심입니다.

4. Prerequisites

  • 컴퓨터 아키텍처 (Basic): 힙(Heap)과 스택(Stack) 메모리 영역의 근본적인 물리적 차이를 이해해야 ARC 역학을 알 수 있습니다. (02-01. Computer Architecture)
  • 컴파일러 구조 (Recommended): 정적 분석과 런타임 바인딩의 차이를 알아야 메서드 디스패치를 최적화할 수 있습니다. (05-03. Compiler Physics)

5. Learning Map

Sequence Core Cluster Objective & Description Evidence (BoK)
1 Value vs Reference Struct(스택)와 Class(힙)의 메모리 할당 차이와 Copy-on-Write 최적화 물리를 이해합니다. Primary
2 ARC Mechanics 참조 횟수(Retain Count) 증감 시그널을 추적하고, weak/unowned로 메모리 누수를 끊어냅니다. Industry
3 Method Dispatch 컴파일 타임에 결정되는 직접 호출(Static)과 런타임에 주소를 찾는 동적 호출(Dynamic/Table)의 성능을 비교합니다. Primary
4 Runtime Safety 옵셔널(Optional) 래핑과 타입 캐스팅을 통해 앱이 런타임에 튕기는 크래시를 물리적으로 차단합니다. Industry

6. Learning Topics

Basic

Core Topic 01: 값 타입, 참조 타입과 Copy-on-Write

  • Why to Learn: 배열이나 딕셔너리를 무작정 복사할 때 메모리가 터지는 것을 막고, Swift의 철학인 값 타입 생태계를 활용하기 위함입니다.
  • What to Learn: Struct와 Class의 메모리 저장(Stack vs Heap) 차이, Copy-on-Write(CoW) 늦은 복사 최적화 메커니즘.
  • How to Learn: 배열 A를 B에 할당할 때는 주소만 공유하다가, B의 원소를 수정하는 순간 물리적으로 메모리를 복제하는 CoW 과정을 디버거 메모리 주소(Address)로 추적합니다.
  • Implement: 커스텀 Struct 내부에 참조 타입(Class)을 감싸서 나만의 CoW 메커니즘을 흉내내는 최적화 데이터 래퍼 작성.

Core Topic 02: 자동 참조 계수 (ARC) 역학

  • Why to Learn: 런타임에 객체가 언제 소멸하는지 통제하여, 메모리 누수로 앱이 강제 종료되는 재앙을 막기 위해서입니다.
  • What to Learn: Retain/Release 명령어, Strong/Weak/Unowned 키워드, 순환 참조(Retain Cycle) 탐지.
  • How to Learn: 부모 클래스와 자식 클래스가 서로를 강한 참조(Strong)하는 코드를 짜고 Instruments 도구를 돌려 Memory Leak(누수) 그래프가 우상향하는 것을 눈으로 확인한 뒤, weak로 바꾸어 그래프가 떨어지는 것을 물리적으로 확인합니다.
  • Implement: 클로저(Closure) 내부에서 발생하기 쉬운 self 강한 캡처 3가지 시나리오를 작성하고, [weak self] 캡처 리스트로 이를 안전하게 해제하는 방어 코드 작성.

Core Topic 03: 메서드 디스패치 (Method Dispatch)

  • Why to Learn: 함수 호출 시 주소를 찾는 시간(Overhead)을 최소화하여 스크롤 렌더링 프레임 방어를 하기 위함입니다.
  • What to Learn: Static Dispatch, Table Dispatch(V-Table/Witness Table), Message Dispatch(@objc dynamic).
  • How to Learn: final 키워드를 클래스에 붙이는 순간 컴파일러가 런타임 테이블 조회를 포기하고 주소를 하드코딩(Static)해버려 실행 속도가 10% 이상 빨라지는 컴파일 최적화 물리를 증명합니다.
  • Implement: 프로토콜(Protocol)과 익스텐션(Extension)을 조합하여, 구현부 위치에 따라 Static Dispatch와 Table Dispatch가 엇갈리게 호출되는 현상(Shadowing)을 재현하는 테스트 스크립트 작성.

7. Terminology

Term (EN / ko, abbr) 1문장 정의 단계(기본/권장/실무/심화) 역할/맥락 관련 개념 유사/대비/함께 사용 오해 포인트 Evidence(Primary/Secondary/Industry) Flags(core)
ARC (Automatic Reference Counting) 객체를 참조하는 곳이 몇 군데인지 숫자를 세고, 0이 되는 순간 메모리에서 삭제하는 컴파일러 기반 기술입니다. 기본 메모리 해제 Retain Count vs. Garbage Collector ARC가 런타임에 도는 데몬 프로세스(GC)라고 착각하는 경우 Industry Docs core
Retain Cycle 두 객체가 서로를 강하게 쥐고 있어(Strong) 참조 횟수가 영원히 0으로 떨어지지 않는 메모리 좀비 상태입니다. 실무 누수 원인 Memory Leak vs. Weak Reference 아무 참조나 지우면 앱이 크래시날 거라 무서워 strong만 쓰는 함정 Primary core
Copy-on-Write (CoW) 값을 복사할 때 곧바로 메모리를 두 배로 할당하지 않고, 값에 변경이 생기는 순간에만 쪼개는 최적화 물리입니다. 실무 메모리 방어 Struct, Value Type vs. Deep Copy 배열을 =로 복사하면 무조건 메모리가 복제된다는 오해 Industry Source core
Dynamic Dispatch 컴파일 타임이 아닌 런타임에 메모리 포인터(V-Table)를 뒤져서 어떤 메서드를 실행할지 찾아가는 함수 호출 규칙입니다. 심화 다형성 호출 V-Table, Polymorphism vs. Static Dispatch 객체 지향 상속이 항상 공짜 최적화라고 생각하는 착각 Primary core

8. References

Primary References

  • [CS2023: Programming Languages] — 메모리 관리, 값/참조 의미론(Semantics) 및 정적/동적 디스패치 원리.
  • [SWEBOK v3: Software Construction] — 런타임 에러 처리 기법 및 자원 관리(Resource Management) 최적화.

Secondary References

  • [Advanced Swift (Chris Eidhof)] — 스택과 힙 메모리 배치, Copy-on-Write 구현체 추적 및 클로저 캡처링 역학.
  • [Swift Open Source Repository] — ARC 컴파일러 패스(SIL: Swift Intermediate Language) 및 참조 계수(RefCount) 비트 연산 물리.

Industry References

  • [Apple Developer: Automatic Reference Counting] — 강한 참조 순환 해결 패턴 및 weak/unowned 선택 전략.
  • [WWDC: Understanding Swift Performance] — Struct vs Class 성능 비교, 프로토콜 위트니스 테이블(Witness Table) 디스패치 구조.

9. Final Checklist

Primary Checklist

  • ARC 환경에서 두 클래스가 상호 참조할 때 발생하는 강한 참조 순환(Retain Cycle)을 weak 키워드로 끊어내는 그래프를 설계할 수 있는가?
  • 값 타입(Struct)과 참조 타입(Class)의 스택/힙(Stack/Heap) 할당 차이를 이해하고 복사 생성 시 Copy-on-Write 최적화가 작동하는지 증명할 수 있는가?

Secondary Checklist

  • 비동기 클로저 내부에서 self를 무분별하게 캡처하여 발생하는 메모리 누수를 탐지하고 캡처 리스트([weak self])로 방어했는가?
  • 상속이 필요 없는 클래스에 final 키워드를 명시하여 동적 디스패치(Dynamic Dispatch)를 정적(Static)으로 컴파일러가 하드코딩하게 최적화했는가?

Industry Checklist

  • 앱 크래시 로그에서 강제 언래핑(!)이나 미소유 참조(unowned) 실패로 인한 런타임 댕글링 포인터 오류를 안전한 옵셔널 바인딩으로 전환했는가?
  • Xcode의 Instruments(Allocations, Leaks) 도구를 사용하여 사용자 시나리오 반복 수행 시 메모리가 우상향하는 좀비 객체를 물리적으로 시각화하여 제거했는가?

Mobile Native Core & Runtimes

2 / 5