Home

Awesome

Collection Data Structures in Swift - KR

Swift의 Collection Data Structures를 소개합니다. 좋은 글이라 생각되어 번역합니다. 핵심적인 부분을 제외하고는 번역을 제외하고 의역했습니다. 본문은 여기를 참고해주세요.

Introduction

많은 데이터를 처리하는 어플리케이션을 만들고 있을 때를 생각해보세요. 그 데이터를 어디에 넣을 건가요? 어떻게 그 많은 데이터를 효율적으로 다룰 건가요? 이럴 때는 Array, Dictionary, Set과 같은 기본적인 데이터 구조들이 필요합니다. 이 collection data structures에 명확한 개념을 가질 경우 처리 속도는 어마어마하게 빨라 질 것입니다.

튜토리얼의 순서는 다음과 같습니다.
  1. 데이터 구조가 무엇인지 배우고, Big-O 표기법에 대해 배워봅니다.
  2. 각 데이터 구조의 퍼포먼스를 확인해봅니다.
  3. 기존의 Cocoa 데이터 구조와 Swift의 새로운 데이터 구조의 퍼포먼스를 비교해봅니다.
  4. 추가의 팁으로 다른 구조들을 조금 더 알아봅니다.

What is Big-O Notation?

컴퓨터에서 데이터를 처리할 때 걸리는 * 시간 * 또는 차지하는 * 메모리 공간 * 은 일반적으로 * 데이터의 양 * 에 비례하게 됩니다. Big-O 표기법은 이때 필요한 시간, 공간을 * 점근적으로(asymptotically) * 표현하는 방법이며, 이렇게 표현한 것을 시간복잡도(time complexity), 공간복잡도(space complexity)라고 부릅니다.

아래는 자주 만날 수 있는 시간복잡도의 Big-O 표기법과 설명을 빠른 것부터 나열한 것입니다.

Big-o

Common iOS Data Structures

Array, Dictionary, Set이 가장 흔한 데이터 구조입니다. 각각의 구조와 성능에 대해 알아봅니다. 또한 Objective-CSwift에서 각각의 데이터 구조를 비교해봅니다.

Array

이럴 때 쓰면 좋습니다.

Swift는 2015년 12월부터 오픈소스입니다. Swift Code로 들어가셔서 구조가 어떻게 되어있는지 확인해보시는 것도 좋은 방법입니다.

아래는 Objective-CSwift의 비교 결과입니다.

상기 글은 스위프트가 얼마나 잘 최적화되었는지 보여줍니다. Swift 쓰세요. 두 번 쓰세요.

Dictionary

이럴 때 쓰면 좋습니다.
if let ellensCat = cats["Ellen"] {
    print("Ellen's cat is named \(ellensCat).")
} else {
    print("Ellen's cat's name not found!")
}

아래는 Objective-CSwift의 비교 결과입니다.

시간복잡도에서는 차이가 없지만, Swift 3.0에서 상당한 속도 향상이 있었습니다.

Set

이럴 때 쓰면 좋습니다.
let names = ["John", "Paul", "George", "Ringo", "Mick", "Keith", "Charlie", "Ronnie"]
var stringSet = Set<String>() // 1
var loopsCount = 0
while stringSet.count < 4 {
    let randomNumber = arc4random_uniform(UInt32(names.count)) // 2
    let randomName = names[Int(randomNumber)] // 3
    print(randomName) // 4
    stringSet.insert(randomName) // 5
    loopsCount += 1 // 6
}
// 7
print("Loops: " + loopsCount.description + ", Set contents: " + stringSet.description)
  1. Set을 초기화합니다.
  2. 아이템을 랜덤으로 뽑습니다.
  3. 해당 index에 있는 값을 가져옵니다.
  4. 로그를 남깁니다.
  5. mutable set에 값을 저장합니다. 만약 값이 이미 저장되어 있는 경우에는 다시 저장하지 않습니다.
  6. 루프 카운트를 늘려서 루프를 다 돌게 합니다.
  7. 루프가 끝나면 값을 로그에 남깁니다.
John
Ringo
John
Ronnie
Ronnie
George
Loops: 6, Set contents: ["Ronnie", "John", "Ringo", "George"]

로그에는 6개의 값이 찍혔지만, 결론적으로 Set에는 4개의 값이 들어가 있습니다.

덜 알려진 데이터 구조들

NSCache

캐시는 화면 뒤에서 비동기적으로 자동으로 메모리에 상주 할지, 남을지 결정합니다.

NSCountedSet

let countedMutable = NSCountedSet()
for name in names {
    countedMutable.add(name)
    countedMutable.add(name)
}

let ringos = countedMutable.count(for: "Ringo")
print("Counted Mutable set: \(countedMutable)) with count for Ringo: \(ringos)")

Counted Mutable set: {(
    George,
    John,
    Ronnie,
    Mick,
    Keith,
    Charlie,
    Paul,
    Ringo
)}) with count for Ringo: 2

NSOrderedSet

ordered setArray의 대안으로 테스팅할 때 사용해보시면 배열보다 더 빠른 것을 알 수 있습니다.

NSHashTable and NSMapTable


Author

younatics 🇰🇷