콘텐츠로 이동

Swift 소유권·메모리 모델

이 페이지는 Swift의 ownership, borrowing, ARC, copy-on-write, lifetime, concurrency isolation을 하나의 이야기로 묶는 상위 허브다. 값/참조 의미론, borrow, consume, exclusivity, ARC, actor isolation은 보통 따로 배우기 쉽지만, 실제로는 모두 Swift의 메모리/수명/이동 규칙이라는 하나의 문제로 다시 만난다.

이 허브가 묶는 5개 축

핵심 질문 연결 페이지
언어 의미 값/참조 의미론, copy-on-write, inout, move-only는 어떤 약속을 가지는가 Swift 언어 개요, Swift 타입 시스템, Value/Reference Types → SIL 소유권 교차 읽기
SIL 소유권 borrow scope, consume, lifetime-ending use, OSSA는 어떻게 표현되는가 소유권 매니페스토, SIL 소유권 모델 (OSSA), Ownership SSA 해설
메모리 접근과 수명 주소 기반 접근, exclusivity, lexical lifetime은 어디서 보이는가 SIL 메모리 접근 모델, SIL (Swift Intermediate Language), Swift 런타임
ABI / runtime 연결 타입 레이아웃, metadata, ARC, reference counting은 어떻게 맞물리는가 표준 라이브러리·런타임·컴파일러의 관계, ABI: 타입 레이아웃, ABI: 타입 메타데이터, Swift 런타임
동시성 / 격리 Sendable, actor isolation, region isolation은 ownership과 어떻게 연결되는가 Swift Concurrency 전체 구조, Swift actor isolation·Sendable, Swift 6 데이터 경쟁 안전성 검사, Concurrency Data Race Safety → 컴파일러 검사 교차 읽기, SIL 옵티마이저 패스 카탈로그

왜 이 허브가 중요한가

Swift에서 ownership과 memory는 단순히 “힙이냐 스택이냐”의 문제가 아니다.

  • value semantics는 저장 위치를 직접 약속하지 않는다.
  • reference semantics는 “로컬 변수 자체가 힙에 있다”는 뜻이 아니다.
  • ARC는 ownership 모델의 일부이지만 ownership 전체와 같지 않다.
  • concurrency safety는 결국 무엇이 어느 실행 문맥으로 안전하게 이동할 수 있는가의 문제이므로 ownership과 다시 만난다.

즉 Swift의 메모리 모델을 이해하려면 값/참조 의미론, lifetime, borrow, consume, copy-on-write, ARC, isolation을 분리해서 보되, 마지막에는 다시 한 장으로 합쳐서 볼 필요가 있다.

자주 헷갈리는 구분

1. value semantics vs storage location

struct가 value type이라는 말은 “항상 stack”이라는 뜻이 아니다. 반대로 class가 reference type이라는 말도 “지역 변수 슬롯까지 heap”이라는 뜻이 아니다. 이 차이를 먼저 잡아야 Value/Reference Types → SIL 소유권 교차 읽기, Swift 런타임, SIL 소유권 모델 (OSSA)가 자연스럽게 이어진다.

2. ownership vs ARC

ARC는 retain/release 기반의 메모리 관리 전략이다. 하지만 ownership은 값의 생성, borrow, consume, lifetime ending use까지 포함하는 더 넓은 계약이다. 그래서 ownership을 보려면 소유권 매니페스토Ownership SSA 해설를 같이 보는 편이 좋다.

3. borrow vs inout vs consume

Swift 표면에서는 이 셋이 비슷하게 “복사 없이 다루는 방식”처럼 보일 수 있다. 하지만 컴파일러 관점에서는 address-only 접근, borrow scope, lifetime, mutation 규칙이 서로 다르다. 이 차이는 SIL 메모리 접근 모델, SIL 함수 호출 규약, SIL 소유권 모델 (OSSA)에서 구체화된다.

4. ownership vs concurrency isolation

동시성 검사 표면에서는 Sendable, actor isolation, global actor 규칙이 보인다. 그러나 구현 층으로 내려가면 region isolation, sendability, lifetime 추적이 ownership 문제와 다시 만난다. 그래서 Swift 6 데이터 경쟁 안전성 검사를 읽을 때도 ownership 배경이 있으면 훨씬 덜 헷갈린다.

컴파일러 안에서는 어디가 핵심인가

1. Sema / 타입 시스템 층

언어 표면의 값/참조 의미론, inout, sendability, isolation 규칙은 먼저 의미 분석과 타입 검사 층에서 판정된다.

관련 페이지: - Swift 타입 시스템 - 타입 체커 설계 및 구현 - 진단 시스템 (Diagnostics) - Swift 6 데이터 경쟁 안전성 검사

2. SILGen / OSSA 층

표면 언어 의미는 SIL로 내려오면서 ownership kind, borrow scope, copy/destroy 규칙으로 드러난다. 이 지점이 Swift ownership 모델의 핵심 구현 입구다.

관련 페이지: - SIL (Swift Intermediate Language) - SIL 소유권 모델 (OSSA) - Ownership SSA 해설

3. 검증기와 mandatory transform 층

OSSA는 설명용 개념으로 끝나지 않는다. borrow scope 축소, move-only 검사, lifetime issue 진단 같은 검증/변환이 뒤따른다. 그래서 ownership은 최적화 이전의 안정성 규칙이면서, 동시에 이후 변환이 의존하는 계약이기도 하다.

관련 페이지: - SIL 옵티마이저 패스 카탈로그 - Swift 옵티마이저 설계 - SIL ARC 최적화

4. runtime / ABI 층

메모리 모델은 결국 실행시 표현과 만나야 한다. metadata, layout, reference counting, value witness, copy-on-write 구현은 ownership 이야기의 런타임 쪽 얼굴이다.

관련 페이지: - 표준 라이브러리·런타임·컴파일러의 관계 - Swift 런타임 - ABI: 타입 레이아웃 - ABI: 타입 메타데이터

로컬 Swift 소스에서 같이 볼 경로

이 주제를 로컬 swift/ 소스 트리와 같이 읽고 싶다면, 아래 경로들이 좋은 진입점이다.

  • swift/docs/OwnershipManifesto.md
  • swift/docs/SIL/Ownership.md
  • swift/lib/Sema/TypeCheckConcurrency.cpp
  • swift/lib/AST/ActorIsolation.cpp
  • swift/lib/SIL/IR/ActorIsolation.cpp
  • swift/lib/SIL/Utils/OSSACompleteLifetime.cpp
  • swift/lib/SIL/Verifier/MemoryLifetimeVerifier.cpp
  • swift/lib/SILOptimizer/Utils/ShrinkBorrowScope.cpp
  • swift/lib/SILOptimizer/Mandatory/MoveOnlyChecker.cpp
  • swift/lib/SILOptimizer/Mandatory/DiagnoseLifetimeIssues.cpp
  • swift/lib/SILOptimizer/Utils/RegionIsolation.cpp
  • swift/lib/SILOptimizer/Mandatory/FlowIsolation.cpp
  • swift/lib/SILOptimizer/Mandatory/SendNonSendable.cpp

이 목록만 봐도 ownership이 단순 문서 주제가 아니라 Sema, SIL, verifier, optimizer, concurrency 검증을 가로지르는 축이라는 점이 드러난다.

추천 읽기 순서

언어 의미에서 들어가는 루트

  1. Swift 언어 개요
  2. Value/Reference Types → SIL 소유권 교차 읽기
  3. 표준 라이브러리·런타임·컴파일러의 관계
  4. 소유권 매니페스토
  5. Swift 런타임

구현 중심 루트

  1. 소유권 매니페스토
  2. SIL (Swift Intermediate Language)
  3. SIL 소유권 모델 (OSSA)
  4. Ownership SSA 해설
  5. SIL ARC 최적화
  6. SIL 옵티마이저 패스 카탈로그

동시성과 연결해서 보는 루트

  1. Swift Concurrency 전체 구조
  2. Swift 6 데이터 경쟁 안전성 검사
  3. Concurrency Data Race Safety → 컴파일러 검사 교차 읽기
  4. SIL 소유권 모델 (OSSA)
  5. Ownership SSA 해설
  6. Swift 런타임

같이 보면 좋은 페이지