WWDC/Swift

[Swift] WWDC18 - Using Collections Effectively(2)

유정주 2022. 12. 20. 00:16
반응형

1편 보기

 

[Swift] WWDC18 - Using Collections Effectively(1)

서론 Collection은 개발에 빠질 수 없는 필수 요소입니다. 이번에 살펴볼 WWDC18 - Using Collections Effectively에서는 Collection을 효과적으로 사용하는 방법을 알려줍니다. 함께 알아봅시다~ Collection Collection

jeong9216.tistory.com

 

Mutable Collection

Mutable Collection은 길이는 변경할 수 없지만, 원소는 변경할 수 있습니다.

이 동작은 상수 시간으로 수행이 가능합니다.

 

Range Replaceable Collections

Range Replaceable Collections는 Collection에서 요소를 제거하거나 삽입할 수 있을 때 얻을 수 있습니다.

 

Why did this collection code crash?

Collection을 좀 더 안전하게 사용하는 방법을 알아보겠습니다.

 

Index out of range가 발생하는 상황 먼저 살펴보겠습니다.

위 예시는 E Index를 구한 뒤 Array의 맨 첫 원소를 삭제하는 상황입니다.

A ~ E까지 들어있는 array에서 Index를 E에 위치시킵니다.

그리고 첫 번째 원소를 삭제하면 Index는 자동으로 변경되는 게 아니라 이전 위치 그대로에요.

이 때, 해당 index의 원소를 참조하면 Index out of range 런타임에러가 발생합니다.

이런 상황을 피하기 위해서는 Index를 미리 구하지 않고 사용 직전에 구해야 합니다.

 

Dictionary에서도 마찬가지로 Index를 생성하고 Collection을 변경하면 에러의 위험이 있습니다.

 

이렇게 Collection의 Index를 구한 후에는 Collection을 변경하는 데 주의를 해야하고,

Collection이 변경된 후에는 Index가 초기화되었을 수도 있음을 주의하세요.

또한, Index를 구할 때 약간의 시간이 걸리므로 꼭 필요할 때만 구해야 합니다!

 

Are your collections reachable from multiple threads?

Swift의 Collection은 Single Thread에서 참조된다고 가정합니다.

즉, Single Thread에 맞춰 최적화가 되어 있습니다.

Lock이나 상호 배제를 위한 자원을 소비하지 않아도 되기 때문입니다.

또한 멀티 스레드에서 Collection을 다루면 매번 다른 결과를 보이거나, 심지어 race condition에 의해 크래시가 발생할 수 있습니다.

따라서 Collection은 싱글 스레드에서 사용함을 권장합니다.

 

Capacity 최적화 하기

Collection을 사용할 때 사용할 Capacity를 설정하면 불필요한 오버헤드를 줄일 수 있습니다.

예를 들어, Collection의 Capacity를 10만 사용하는데 100이 할당되면 손해겠죠?

이럴 때, 나는 10만 사용할 것이다! 라고 알려준다면 불필요한 90만큼의 오버헤드를 줄일 수 있습니다.

단! 잘못된 예측이나 귀찮다는 이유로 capacity를 크게 잡는다면 오버헤드가 커질 수 있으니 주의해서 사용해야 합니다.

 

Foundation Collections

Foundation을 임포트하면 Objective-C에서 사용되었던 참조형(Reference Type) Collection도 사용할 수 있습니다.

사용을 할 때는 반드시 Reference 타입이라는 것을 명심해야 합니다.

Swift의 Collection은 Value 타입이지만 NS가 붙은 Objective-C의 Collection은 Reference 타입입니다.

 

Value 타입과 Reference 타입의 차이는

이렇게 아예 다른 결과를 불러오니 반드시 주의해야 합니다.

 

Reference 타입임을 주의해서 사용한다면 불필요한 메모리 할당을 줄일 수 있다는 장점이 있습니다.

 


아직은 초보 개발자입니다.

더 효율적인 코드 훈수 환영합니다!

공감 댓글 부탁드립니다.

 

 

반응형