Swift: Existential Container

틀틀보·2025년 8월 30일

Swift

목록 보기
12/19

Swift에서 프로토콜 타입의 값을 저장하기 위해 사용하는 보이지 않는 내부 메모리 구조(상자)

어디에 사용하는 개념일까?

  • 동적 디스패처가 프로토콜을 준수하는 객체의 함수의 호출 메모리 주소를 알기 위해서는 Witness Table이라는 함수 주소가 적혀 있는 테이블을 참조

  • 이 때, 실제 객체, Witness Table, 메타 데이터를 가지는 Container를 의미

왜 Existential(실존)일까?

어떤 구체적인 타입이 존재는 하나, 컴파일 시점에는 그게 뭔지 모름을 의미함.
프로토콜을 준수하는 변수가 A-A일지, A-B일지 모름.

구성 요소

값 버퍼

  • 실제 값이 저장되는 공간

  • 저장하려는 값이 적으면 이 버퍼에 직접 저장

  • 값이 이보다 크면, 힙(Heap) 메모리에 값을 할당하고 그 주소를 가리키는 포인터를 저장

  • 클래스 인스턴스(참조 타입)의 경우 항상 포인터를 저장

타입 메타데이터 포인터 (VWT: Value Witness Table)

  • 저장된 값의 구체적인 타입 정보(Bird, Drone 등)를 가리키는 포인터

  • 이 메타데이터를 통해 해당 타입의 크기, 정렬 방식 등을 알 수 있고, 값을 복사하거나 제거하는 등의 작업을 수행

Witness Table 포인터

  • 이 컨테이너가 어떤 프로토콜을 위해 만들어졌는지, 그 프로토콜의 요구사항을 어떻게 이행하는지에 대한 정보가 담긴 Witness Table을 가리키는 포인터

  • 프로토콜의 메서드를 호출할 때, 이 포인터를 따라가서 실제 실행할 함수의 주소를 찾음.

왜 필요할까?

  • 프로토콜 타입의 변수는 클래스, 구조체처럼 서로 다른 종류와 크기를 가진 값을 모두 담을 수 있어야 함.

  • Existential Container는 이처럼 다양한 타입의 값들을 일관된 메모리 레이아웃으로 추상화하여, 컴파일러와 런타임이 타입에 상관없이 동일한 방식으로 값을 다룰 수 있게 해주는 방법

참고
https://developer.apple.com/videos/play/wwdc2016/416/

profile
안녕하세요! iOS 개발자입니다!

0개의 댓글