본문 바로가기

[Swift 5.1] 초기화 없는 배열 생성하기 (SE-0245)

기술적인 이야기/애플 플랫폼 개발 2019. 10. 24.
반응형

이 뜬금없는 제목의 변화는 SE-0245 Add an Array Initializer with Access to Uninitialized Storage 프로포절에서 제시된 내용입니다.

일반적으로 Swift에서 Array를 특정 개수의 배열로 만들기 위해서는 반드시 데이터를 채워 넣어야 합니다. 예를 들어 5개 크기의 배열을 만든다면 아래와 같은 식이죠.

let list = [0, 0, 0, 0, 0]

물론 이것 말고로 몇 가지 단순화된 방법이 있긴 하지만 아마도 이게 가장 흔한 예제일 것 같습니다.

그런데 굳이 초기화 값이 꼭 필요한 것이 아니라면 Swift 5.1부터는 아래와 같은 식으로도 만들 수 있게 됩니다.

let list = [Int](unsafeUninitializedCapacity: 5) { (buffer, initializedCount) in
    initializedCount = 5
}

이 코드를 실제로 돌려보면 엄청난 혹은 이상한(?) 값이 들어있는 배열(Array)을 구할 수 있습니다. 궁금하시면 실제로 돌려보세요.

위 코드에서 필요하다면 클로져의 첫 번째 파라미터인 buffer라고 이름을 붙인 버퍼 포인터를 이용해 초기화를 할 수도 있습니다. 그리고 클로져의 2번째 파라미터는 inout으로 되어있는데 여기에 실제로 초기화된 개수를 넘겨주는 식으로 사용하는 것 같습니다.

왜 이렇게 초기화되지 않은 배열이 필요한 것일까요?

프로포절에서는 Contiguous Array의 필요성에 대해 언급하고 있습니다. 쉽게 표현해서 연속된 한 덩어리의 메모리 블록으로 Array를 만드는 것이지요. 이렇게 하면 장점이 모든 배열 인덱스를 접근할 때 O(1)으로 접근할 수 있게 됩니다. 링크드 리스트(Linked List)처럼 분리된 메모리를 순차적으로 탐색할 필요성이 사라지게 되기 때문에 퍼포먼스 측면에선 제법 이점을 얻을 수 있게 됩니다.

이와 비슷하게 역시 5.1에서 추가된 SE-0247 Contiguous Strings 프로포절도 동일하게 연속된 메모리에 문자열을 할당하는 방식으로 역시 퍼포먼스를 높이기 위한 방법으로 생각됩니다. (따라서 SE-0247 업데이트는 별도의 글을 작성하지 않을 생각입니다)

물론 Contiguous Array가 꼭 필요한 상황이라거나 혹은 일부러 초기화되지 않은 값들이 필요한 경우라면 쓸 수도 있겠지만, 대부분의 앱 개발자는 이런게 있는 줄은 몰라도 별로 문제는 없을 거라고 생각됩니다. 😏

728x90
반응형

댓글