Swift의 Array 타입의 인스턴스가 메모리 공간에서 어떻게 생성되는지 궁금하여 Stack Overflow에 직접 질문을 올려보았고, Array 코드를 파헤쳐 보았다.
var arr: Array<Int> = [1, 2, 3]
위와 같이 배열 리터럴 값을 할당하여 Array 인스턴스를 초기화하면, Array의 구현부와 ExpressibleByArrayLiteral 프로토콜의 메서드인 init(arrayLiteral:) 구현부에 의해 초기화가 된다.
Array 구현부
ExpressibleByArrayLiteral Pr.
init(arrayLiteral:) 구현부
Array는 ExpressibleByArrayLiteral 프로토콜을 채택하고 있다.
즉, Array 구조체 인스턴스에 배열 리터럴 값인 elements
가 저장되어진다.
이제 컴파일 시점에 Array의 조건부 컴파일에 의해 두 가지 방법중 하나를 선택하게 되는데,
Element가 참조 타입인 경우: _Buffer = ArrayBuffer<Element>
Element가 값 타입인 경우: _Buffer = ContiguousArrayBuffer<Element>
할당되는 값이 배열 리터럴 값이므로 Array의 _buffer
프로퍼티는 ContiguousArrayBuffer<Element> 타입이 된다.
💡 Element가 '값 타입' 인 경우, Array<Element>의 성능은 ContiguousArray<Element>의 성능과 동일하다.
ContiguousArrayBuffer<Element>
ContigousArrayBuffer<Element>의 storage
프로퍼티는 ContiguousArrayStorageBase 클래스 타입이므로, storage
는 ContiguousArrayBuffer<Element>의 init(_ storage:) 메서드에서 초기화가 된다(?)
위의 일련의 과정을 거쳐 Array 인스턴스를 생성하면, ContiguousArrayStorageBase 클래스 타입의 storage
에 의해 배열 요소를 비롯한 메타데이터가 heap 영역에 저장된다.
'The Swift Array Design - Components'에서 Array의 구성요소를 도식화한 그림이다.
바로 위에서 Array 인스턴스가 초기화 되는 과정과 비슷한 구성을 이루는 것 같다.
완벽하게 이해한 것은 아니나 참고하면 좋을만한 레퍼런스 링크를 남긴다.
(더 자세하게 알아보신 분들이 분명 계실 것이다.)
References)