μλ νμΈμ! μ΄λ² ν¬μ€ν μ Swift λ°μ΄ν°κ΅¬μ‘°μ μκ³ λ¦¬μ¦ μ± μ 2μ₯ μ€ν°λ μ€ λλ²μ§Έ ν΅μ¬ λ΄μ©μΈ Collection Type μ λν λ΄μ©μ λλ€. Array (λ°°μ΄), Dictionary (λμ λ리, μ¬μ ν), Set (μΈνΈ), Tuple(νν) λ€κ°μ§ νμ μ λν΄ νμ΅νμ΅λλ€.
π 컬λ μ νμ (Collection Type)
컬λ μ νμ μ μ¬λ¬ κ°μ μ μ₯ν μ μλ ννλ‘, Swift μ ꡬνλ 컬λ μ νμ μ Array, Dictionary, Set κ° μμ΅λλ€. Tuple μ 컬λ μ νμ μ μλμ§λ§, μ μ¬ν λ°©μμΌλ‘ νμ©λ©λλ€!
- λ°°μ΄(Array) : μμλ₯Ό κ°μ§λ©°, λμΌ νμ μ κ°μ λͺ©λ‘μΌλ‘ μ μ₯νλ 컬λ μ
- λμ λ리(Dictionary; μ¬μ ν) : λμΌν λ°μ΄ν° νμ μ΄ Key: Value μμΌλ‘ λ¬ΆμΈ μμκ° μλ 컬λ μ , μ¬μ κ³Ό λΉμ·ν ꡬ쑰
- μΈνΈ(Set) : nil μ΄ ν¬ν¨λμ§ μκ³ μλ‘ μ€λ³΅λμ§ μλ κ°μΌλ‘ ꡬμ±λ μμκ° μλ 컬λ μ , μνμμμ μ§ν© κ°λ μ κΈ°λ°μΌλ‘ λ§λ νμ
- νν(Tuple) : λ€μν λ°μ΄ν° νμ μ κ°μ λ΄μ μ μλ νμ (λ΄λΆ μμκ° λͺ¨λ κ°μ νμ μ΄ μλμ΄λ λ¨), μ°κ΄ κ°μ μμ κ·Έλ£Ήμ λ§λλλ° μ¬μ© (ν¨μμΈμ, λ°νκ° λ±)
βοΈ λ°°μ΄(Array)
λ°°μ΄(Array) λ μμλ₯Ό κ°μ§λ©°, λμΌ νμ μ κ°μ λͺ©λ‘μΌλ‘ μ μ₯νλ λ°μ΄ν° νμ μ λλ€. Swift μμ λ°°μ΄μ μ μ₯νλ κ°μ Generic type collections μΌλ‘ int, float, string, μ΄κ±°ν(enumerate), ν΄λμ€κΉμ§ μ΄λ€ νμ μ΄λ κ°λ₯ν©λλ€.
βοΈ λ°°μ΄ μ΄κΈ°ν
Swift νμ€ λΌμ΄λΈλ¬λ¦¬λ λ€κ°μ§ μ΄κΈ°ν λ©μλλ₯Ό μ 곡ν©λλ€.
μ λ μΈλ²μ§Έ λ°©μμΈ λ°°μ΄μ κ°μ μ§μ ν΄ μ μΈνλ λ°©μμ μμ£Ό μ¬μ©ν΄μ. νΉμ μ΄κΈ°κ° μ§μ μ΄ νμν κ²½μ° 4λ²μ§Έ λ°©μμ μ΄μ©ν©λλ€!
// 1 μ μ λ¬Έλ²
var intArray = Array<Int>()
// 2 λ¨μΆ νν λ¬Έλ²
intArray = [Int]()
// 3 λ°°μ΄μ κ°μ μ§μ ν΄μ μ μΈνλ λ°©μ
var intLiteralArray: [Int] = [1, 2, 3]
// 3-1 μμ λ¨μΆ νν λ°©μ (νμ
μ Intλ‘ μΆμ λλ€)
intLiteralArray = [1, 2, 3]
// 4 νλμ νΉμ κ°μΌλ‘ λ°°μ΄ μμ±νκΈ° [2, 2, 2, 2, 2]
intLiteralArray = [Int](repeating:2, count: 5)
βοΈ λ°°μ΄ μμ μΆκ° λ° μ λ°μ΄νΈ
- append(_:) λ©μλ
λ°°μ΄μ 맨 λ§μ§λ§ λΆλΆμ μλ‘μ΄ μμλ₯Ό μΆκ°νλ€. μκ°λ³΅μ‘λ O(1) - append(contentsOf:) λ©μλ
λ°°μ΄μ 맨 λ§μ§λ§ λΆλΆμ μνμ€μ μμλ€μ μΆκ°νλ€. μκ°λ³΅μ‘λ νκ· O(m), m μ μΆκ°λλ μνμ€μ κΈΈμ΄ - insert(_: at:) λ©μλ
λ°°μ΄μ νΉμ μΈλ±μ€μ μλ‘μ΄ μμλ₯Ό μΆκ°νλ€.
μκ°λ³΅μ‘λ O(n), n μ λ°°μ΄μ κΈΈμ΄. λ§μ§λ§ μΈλ±μ€μΈ κ²½μ°, append λ©μλμ κ°μμ§λ―λ‘ O(1) - insert(contentsOf: at:) λ©μλ
λ°°μ΄μ νΉμ μΈλ±μ€μ μνμ€μ μμλ€μ μΆκ°νλ€.
μκ°λ³΅μ‘λ O(n + m), nμ κΈ°μ‘΄ λ°°μ΄μ κΈΈμ΄, m μ μΆκ°λλ μνμ€μ κΈΈμ΄.
λ§μ§λ§ μΈλ±μ€μΈ κ²½μ° append(contentsOf:) λ©μλμ κ°μμ§λ―λ‘ O(m). - λ°°μ΄ μμ μ
λ°μ΄νΈ array[i]
λ°°μ΄μ νΉμ μΈλ±μ€μ μμ κ°μ λ³κ²½ν λμλ μλΈμ€ν¬λ¦½νΈ λ¬Έλ²μ μ¬μ©ν΄μ λ³κ²½ν μ μλ€.
// Declaration
mutating func append(_ newElement: Int)
mutating func append<S>(contentsOf newElements: S) where Element == S.Element, S : Sequence
mutating func insert(_ newElement: Int, at i: Int)
mutating func insert<C>(contentsOf newElements: C, at i: Int) where C : Collection, Self.Element == C.Element
// Example code
var intArray : [Int] = []
intArray.append(4)
// [4]
intArray.append(contentsOf: [5, 6, 7])
// [4, 5, 6, 7]
intArray.insert(1, at: 0)
// [1, 4, 5, 6, 7]
intArray.insert(contentsOf: [2, 3], at: 1)
// [1, 2, 3, 4, 5, 6, 7]
intArray[0] = 0
// [0, 2, 3, 4, 5, 6, 7]
βοΈ λ°°μ΄μμ μ¬λ¬ μμλ₯Ό κ°μ Έμ€λ λ°©λ²
- μλΈμ€ν¬λ¦½νΈμ μΈλ±μ€ λ²μλ₯Ό ν΅ν΄ κ°μ κ°μ Έμ€κ±°λ μ λ°μ΄νΈν μ μλ€.
- for ... in λ¬Έλ²μ ν΅ν΄ λ°°μ΄ μμλ₯Ό λ°λ³΅ν μ μλ€.
- for ... in λ¬Έλ² μ¬μ©μ μΈλ±μ€μ κ°μ λμμ μ¬μ©νκΈ° μν΄μλ enumerate(array) ν¨μλ₯Ό μ΄μ©ν μ μλ€.
// intArray = [0, 2, 3, 4, 5, 6, 7]
intArray[1...4] // [2, 3, 4, 5], μΈλ±μ€ 4 λ₯Ό ν¬ν¨νλ€.
intArray[1..<4] // [2, 3, 4], μΈλ±μ€ 4 λ₯Ό ν¬ν¨νμ§ μλλ€.
intArray[0...2] = [10, 20, 30] // intArray = [10, 20, 30, 4, 5, 6, 7]
// λ°°μ΄μ λͺ¨λ μμλ₯Ό λ°λ³΅νλ€
for element in intArray {
print(element)
}
// λ°°μ΄μ μμλ₯Ό λ°λ³΅νλ©° μΈλ±μ€λ₯Ό ν¨κ» μ¬μ©ν μ μλ€
for (index, value) in enumerate(intArray) {
print("intArray[\(index)]: \(value)")
}
βοΈ λ°°μ΄μ κ°μ νμΈ, νΉμ κ°μ΄ μλμ§ νμΈ, νΉμ κ°μ μΈλ±μ€λ₯Ό μ°ΎκΈ°
- array.count μμ± :: λ°°μ΄μ κ°μλ₯Ό νμΈνλ μμ± (Int)
- array.isEmpty μμ± :: λ°°μ΄μ΄ λΉμλμ§ νμΈνλ μμ± (Bool)
- array.contains(_:) λ©μλ :: νΉμ κ°μ΄ μλμ§ νμΈν΄ Bool κ°μ λ°ν.
- array.firstIndex(of:) λ©μλ :: νΉμ κ°κ³Ό μΌμΉνλ 첫λ²μ§Έ μΈλ±μ€λ₯Ό λ°ν, μλ κ²½μ° nil
- array.lastIndex(of:) λ©μλ :: νΉμ κ°κ³Ό μΌμΉνλ λ§μ§λ§ μΈλ±μ€λ₯Ό λ°ν, μλ κ²½μ° nil
intArray.count // 7
intArray.isEmpty // false
intArray.contains(55) // false
intArray.firstIndex(of: 2) // 1
intArray.lastIndex(of: 2) // 1
intArray.firstIndex(of: 10) //nil
π‘ ArraySlice ?
λ°°μ΄μ μλΈμ€ν¬λ¦½νΈ, μΈλ±μ€ λ²μλ₯Ό ν΅ν΄ μλ‘μ΄ λ²μμ λ°°μ΄μ μ§μ ν κ²½μ°, μ΄λ Array νμ μ΄ μλ ArraySlice νμ μ΄ λ©λλ€. ArraySlice λ κΈ°μ‘΄ λ°°μ΄μ μ μ₯μλ₯Ό μ°Έμ‘°νκ³ , Array κ° μ 곡νλ μμ±κ³Ό λ©μλλ₯Ό μ¬μ©ν μ μμ΅λλ€. (ArraySlice λ κΈ°λ³Έμ μΌλ‘ writing νμ§ μμ κ²μ΄λΌλ κ°μ μ νλ€κ³ ν©λλ€.)
ArraySlice μ μλ³Έ λ°°μ΄μ λΌμ΄ν μ¬μ΄ν΄μ΄ λλλ©΄, ArraySlice μ μ μ₯λ λ°°μ΄ μμλ€λ μ κ·Ό λΆκ°λ₯ν΄μ§λλ€. λν, ArraySlice μΈμ€ν΄μ€κ° μ΄μμλ λμ Array μ λν μ°Έμ‘°κ° κ³μ μ μ§λλ―λ‘, μ€λμκ°λμ μ¬μ©λμ§ μλ κ²μ΄ μ’λ€κ³ ν©λλ€. (λΌμ΄ν μ¬μ΄ν΄μ΄ κΈ΄ ν΄λ‘μ λ±μμ ArraySlice λ₯Ό μ°Έμ‘°νμ§ μλλ‘ ν©λλ€.)
ArraySlice μΈμ€ν΄μ€μ μμ μΈλ±μ€λ νμ 0 μ΄ μλ μ μ΄ μ€μνλ°μ, μλ μ½λμμ subIntArray[0] μ μλ¬κ° λ°μν©λλ€ π..! μμ νκ² μ κ·ΌνκΈ° μν΄ startIndex, endIndex λ₯Ό νμ©ν©μλ€. subIntArray[2] μ κ°μ΄ μ κ·Όν μλ μμ§λ§, λ§€λ² κ°λ¨ν λ°°μ΄μ μ°μ°μ νλ건 μλλκΉμ.
var intArray: [Int] = [1, 2, 3, 4, 5]
var subIntArray = intArray[2...4] // [3, 4, 5]
print(type(of: intArray)) // Array<Int>
print(type(of: subIntArray)) // ArraySlice<Int>
//subIntArray[0] // Fatal error: Index out of bounds
subIntArray.startIndex // 2
subIntArray[subIntArray.startIndex] // 3
subIntArray[2] // 3
π‘ Copy-on-Write (CoW) ?
Copy-on-Write (CoW) λ νΉμ μΈμ€ν΄μ€λ₯Ό 볡μ¬ν κ²½μ°, μμ (Write)μ΄ μΌμ΄λ λ 볡μ¬(Copy) νλ κΈ°λ²μ λλ€.
μ€μννΈμ Collection Type μΈ Array, Dictionary, Set μμ μλ³Έ 리μμ€λ₯Ό 볡μ¬ν λ μ μ©λ©λλ€.
* μ¬μ©μ μ μ ꡬ쑰체μμλ CoW κ°λ μ μ μ©ν μ μμ΅λλ€. (μ¬κΈ° λ§ν¬λ₯Ό μ°Έκ³ ν΄μ£ΌμΈμ)
μ 리νμλ©΄!
- μλ³Έμ΄λ 볡μ¬λ³Έμ΄ μμ λκΈ° μ κΉμ§λ 볡μ¬λ₯Ό νμ§ μκ³ , μλ³Έ 리μμ€λ₯Ό 곡μ νλ€.
- μλ³Έμ΄λ 볡μ¬λ³Έμμ μμ μ΄ μΌμ΄λ κ²½μ°, κ·Έ λ 볡μ¬νλ μμ μ νλ€.
- => μμ νμ§ μλ κ²½μ°μλ μλ³Έ 리μμ€λ₯Ό μ°Έμ‘°νμ¬ λΆνμν λ©λͺ¨λ¦¬ μ¬μ©κ³Ό μκ°μ μ€μ΄κΈ° μν¨μ΄λ€.
π‘ λ°°μ΄ μ©λ (Array's capacity) ?
λ°°μ΄μ instance λ₯Ό μμ±νλ©΄ ν΄λΉ λ°°μ΄ μμλ₯Ό μ μ₯νκΈ° μν μΆκ° μ μ₯ 곡κ°μ΄ ν λΉλ©λλ€. μ΄λ¬ν μΆκ° μ μ₯ 곡κ°μ λ°°μ΄ μ©λ(Array's capacity) λΌκ³ νλ©°, λ°°μ΄μ μ μ₯λ μμμ κ°μμ μ μ¬μ μΈ μ μ₯ 곡κ°μ ν¬ν¨ν μ©λμ λλ€.
- Array.count :: λ°°μ΄μ μ μ₯λ μμμ κ°μ
- Array.capacity :: μ μ μ₯μλ₯Ό ν λΉνμ§ μκ³ λ°°μ΄μ μ μ₯ν μ μλ μμμ κ°μ (μ μ¬μ μΈ μ μ₯ 곡κ°μ ν¬ν¨)
λ°°μ΄μ λλμ μμκ° μΆκ°λ κ²μ 미리 μκ³ μλ κ²½μ°, reserveCapacity(_ capacity:) λ©μλλ₯Ό ν΅ν΄ μΆκ°μ μΈ λ°°μ΄ μ©λμ 미리 ν λΉν μ μμ΅λλ€! μ μ₯ 곡κ°μ 미리 ν보ν΄λμ΄, μλ‘μ΄ μμκ° μΆκ°λ λλ§λ€ μ€μ€λ‘ μ μ₯곡κ°μ ν λΉνλλ° λλ μκ°μ μ€μΌ μ μμ΅λλ€.
var intArray = [Int]()
intArray.capacity // 0κ° μμλ₯Ό ν¬ν¨
intArray.reserveCapacity(500)
intArray.capacity // 508κ° μμλ₯Ό ν¬ν¨ (μ€ν μ±λ₯μ κ³ λ €ν΄ μ€μ μμ²ν μ μ΄μμΌλ‘ ν λΉ)
π λμ λ리(Dictionary)
π μΈνΈ(Set)
π νν(Tuple)
μ°Έκ³ λ§ν¬
- [Apple Developer Documentation] reserveCapacity(_:) method
- [λ―Όμλ€λ λΈλ‘κ·Έ] [Swift] Collection Types μ 리
- [Zeddλ λΈλ‘κ·Έ] Swift3) Array. count? capacity?
- [Wireframeλ λΈλ‘κ·Έ] (Swift) Array μμ μ 볡 - 04.ArraySlice
- [무과μ₯λ λΈλ‘κ·Έ] [Swift] classμ struct κ·Έλ¦¬κ³ Copy On Write