Bibi's DevLog π€π
[Swift μλ£κ΅¬μ‘°] 1. Array λ°°μ΄ (μμ±, CRUD, COW) λ³Έλ¬Έ
[Swift μλ£κ΅¬μ‘°] 1. Array λ°°μ΄ (μμ±, CRUD, COW)
λΉλΉ bibi 2022. 12. 16. 12:37https://nitinagam17.medium.com/data-structure-in-swift-ios-part-1-305dd33e19f5
μμ λ λ¬Έμλ₯Ό κΈ°λ°μΌλ‘ μ 리νμ΅λλ€.
Array
λ°°μ΄ : μμκ° μκ³ μμ μ κ·Όμ΄ κ°λ₯ν 컬λ μ (κ°μ λͺ¨μ).
κ°μ₯ ννκ² μ°λ λ°μ΄ν° νμ μ΄λ€.
Array
An ordered, random-access collection.
@frozen struct Array<Element>
- Array : λ¨μΌ νμ μ μμλ€μ λ΄μ
- Element : Array λ΄λΆμ μμμ νμ
μμ±
let nameArray = ["Alex", "Martin", "Harry"]
let oddNumbers = [1, 3, 5, 7, 9, 11, 13, 15]
// Element νμ
μ μ μΈν΄ λΉ λ°°μ΄μ λ§λ€ μ μλ€
var emptyDoubles: [Double] = []
var emptyFloats: Array<Float> = Array()
var digitCounts = Array(repeating: 0, count: 10)
print(digitCounts) // [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
λ°°μ΄μ κ°μ μ κ·ΌνκΈ°
let oddNumbers = [1, 3, 5, 7, 9, 11, 13, 15]
if oddNumbers.isEmpty {
print("I don't know any odd numbers.")
} else {
print("I know \(oddNumbers.count) odd numbers.")
}
// Prints "I know 8 odd numbers."
if let firstElement = oddNumbers.first, let lastElement = oddNumbers.last {
print(firstElement, lastElement, separator: ", ")
}
// Prints "1, 15"
print(emptyDoubles.first, emptyDoubles.last, separator: ", ")
// Prints "nil, nil"
print(oddNumbers[0], oddNumbers[3], separator: ", ")
// Prints "1, 7"
print(emptyDoubles[0])
// Triggers runtime error: Index out of range
isEmpty
:O(1)
count
:O(1)
first
last
:O(1)
- λ±λ± λ€μν νλ‘νΌν°κ° μ‘΄μ¬ν¨
- μλΈμ€ν¬λ¦½νΈλ₯Ό μ¬μ©ν΄ μΈλ±μ€λ‘λ μ κ·Ό κ°λ₯
λ°°μ΄μ νΉμ§
for name in nameArray { // Sequence
print(name)
}
let firstName = nameArray.[0]
let lastName = nameArray.last
- μ λ€λ¦μΌλ‘ ꡬνλ 컬λ μ
μ
- = μ΄λ€ νμ μ λ°μ΄ν°λ λ΄μ μ μλ€.
- λ°°μ΄μ Sequence μ
- λ°λ³΅λ¬Έμ μ¬μ©ν΄ λ°°μ΄μ λ°λ³΅(iterate)ν μ μμ.
- λ°°μ΄μ 컬λ μ
μ
- μμλ₯Ό μνν μ μμ
- μλΈμ€ν¬λ¦½νΈλ₯Ό μ¬μ©ν μ μμ.
Array[index]
- λ°°μ΄μ
RandomAccessCollection
νλ‘ν μ½μ μ€μν¨- = ν¨μ¨μ±μ 보μ₯ν¨
- μλ₯Ό λ€μ΄, λ°°μ΄μ ν¬κΈ°κ° ν¬λ μλ
Array.count
νλ‘νΌν°μ κ°μ κ°μ Έμ€λ λ° λμΌν μκ°μ΄ κ±Έλ¦Ό.
λ°°μ΄μ λ©μλ - μ½μ , μμ , μμ , νμ (CRUD) λ±λ±
- μ½μ
Insert
append(_:)
- λ°°μ΄μ λ§μ§λ§μ μμ μ½μ
:
O(1)
. κ°μ₯ ν¨μ¨μ μΈ λ°©λ². - λ©λͺ¨λ¦¬ μ¬ν λΉμ΄ μΌμ΄λ λλ μμΈμ μΌλ‘
O(n)
μκ°μ΄ κ±Έλ¦°λ€.
- λ°°μ΄μ λ§μ§λ§μ μμ μ½μ
:
append(contentsOf:)
- λ°°μ΄μ λ§μ§λ§μ λ°°μ΄ μ½μ
:
O(M)
(Mμ μλ‘μ΄ Elementsμ κ°μ)
- λ°°μ΄μ λ§μ§λ§μ λ°°μ΄ μ½μ
:
insert(_:at:)
- λ°°μ΄μ νΉμ μμΉμ μμ μ½μ
:
O(n)
μκ°μ΄ κ±Έλ¦°λ€.
- λ°°μ΄μ νΉμ μμΉμ μμ μ½μ
:
- μμ Remove
removeLast()
- λ°°μ΄μ λ§μ§λ§ μμ μμ :
O(1)
- λ°°μ΄μ λ§μ§λ§ μμ μμ :
remove(at:)
- λ°°μ΄μ νΉμ μμΉμ μμ μμ :
O(n)
- λ°°μ΄μ νΉμ μμΉμ μμ μμ :
removeFirst()
- λ°°μ΄μ 첫 μμ μμ :
O(n)
- λ°°μ΄μ 첫 μμ μμ :
- μμ Update
- μ΄λ―Έ μ‘΄μ¬νλ μμμ μ κ°μ ν λΉν¨μΌλ‘μ κ°μ λ°κΏ μ μλ€.
- νμ Read / Search
- μλΈμ€ν¬λ¦½νΈ :
O(1)
contains(_:)
:O(n)
firstIndex(of:)
,lastIndex(of:)
- 첫 λ²μ¨°λ‘ λνλλ / λ§μ§λ§μΌλ‘ λνλλ μμμ μΈλ±μ€ μ°ΎκΈ° :
O(n)
- 첫 λ²μ¨°λ‘ λνλλ / λ§μ§λ§μΌλ‘ λνλλ μμμ μΈλ±μ€ μ°ΎκΈ° :
min()
,max()
- μ΅μ/μ΅λκ° μ°ΎκΈ° :
O(n)
- μ΅μ/μ΅λκ° μ°ΎκΈ° :
- μλΈμ€ν¬λ¦½νΈ :
- μ λ ¬ Sort
sort()
,sorted()
- μ λ ¬νκΈ° :
O(N logN)
. Tim Sort λΌλ λ°©λ² μ¬μ©.
- μ λ ¬νκΈ° :
split(separator:maxSplits:omittingEmptySubsequences:)
- separator κΈ°μ€μΌλ‘ λλκΈ° -
O(n)
- separator κΈ°μ€μΌλ‘ λλκΈ° -
λ°°μ΄μ ν¬κΈ° λ리기
λͺ¨λ λ°°μ΄μ μμλ₯Ό λ΄κΈ° μν΄ μΌμ λμ λ©λͺ¨λ¦¬λ₯Ό μ°¨μ§νλ€.
μμλ₯Ό μΆκ°νμ λ λ°°μ΄μ ν¬κΈ°κ° λμ΄λμΌ νλ€λ©΄, κΈ°μ‘΄ λ°°μ΄μ 2λ°°μ ν΄λΉνλ μ λ©λͺ¨λ¦¬ 곡κ°μ μ‘κ³ κΈ°μ‘΄ κ°μ 볡μ¬ν΄ λ£λ μμΌλ‘ ν¬κΈ°κ° λμ΄λλ€. μ΄λ¬ν μ¬ν λΉ(reallocation) μμ μ μ±λ₯ λΉμ©μ΄ μμ§λ§, λ°°μ΄μ΄ 컀μ§μ λ°λΌ λ°μ λΉλκ° μ€μ΄λ λ€.
λ§μ½ λ°°μ΄μ μΌλ§λ λ§μ μμλ€μ μ μ₯νκ² λ μ§ λλ΅μ μΌλ‘ μκ³ μλ€λ©΄, λ°°μ΄μ κ°μ λ£κΈ° μ μ reserveCapacity(_:)
λ©μλλ₯Ό μ¬μ©ν΄ μ¬ν λΉμ νΌν μ μλ€. λ, capacity
μ count
νλ‘νΌν°λ₯Ό μ¬μ©ν΄ μ¬ν λΉ μμ΄ μΌλ§λ λ λ§μ μμλ€μ λ°°μ΄μ μ μ₯ν μ μλμ§ κ°λ ν μ μλ€.
λ°°μ΄μ 볡μ¬κ° μμ νκΈ°
κ°κ°μ λ°°μ΄μ μμ μ μμλ€μ λͺ¨λ ν¬ν¨νλ λ 립μ μΈ κ°μ κ°μ§λ€.
- λ°°μ΄μ μμκ° κ°λ¨ν νμ
μ΄λ ꡬ쑰체μ κ²½μ°
- κ°μ ν΅μ§Έλ‘ 볡μ¬νλ―λ‘, μ΄λ€ λ°°μ΄μ μμ λ΄μμ΄ λ€λ₯Έ λ°°μ΄μ μν₯μ λ―ΈμΉμ§ μλλ€.
- Swiftμ λ°°μ΄μ ꡬ쑰체μ΄κΈ° λλ¬Έμ, λ€λ₯Έ μμλ λ³μμ ν λΉλκ±°λ ν¨μμ μ λ¬λ λ λ°°μ΄μ κ°μ 볡μ¬λμ΄ μ λ¬λλ€.
- μλ μμ μ°Έμ‘°.
let numberArray = [1, 2, 3, 4, 5]
var otherNumberArray = numberArray
print(numberArray) // [1, 2, 3, 4, 5]
print(otherNumberArray) // [1, 2, 3, 4, 5]
otherNumberArray[2] = 10
print(numberArray) // [1, 2, 3, 4, 5]
print(otherNumberArray) // [1, 2, 10, 4, 5]
- λ°°μ΄μ μμκ° ν΄λμ€μ μΈμ€ν΄μ€μΈ κ²½μ°
- λ°°μ΄μ μ μ₯λ κ°λ€μ΄ κ°κ° λ°°μ΄ μΈλΆ κ°μ²΄μ λν μ°Έμ‘°κ° λλ€.
- κ°μ κ°μ²΄λ₯Ό μ°Έμ‘°νλ λ°°μ΄λ€μ, κ·Έ κ°μ²΄κ° λ³κ²½λμμ λ ν¨κ» λ³κ²½λλ€.
- μλ μμ μ°Έμ‘°.
// An integer type with reference semantics
class IntegerReference {
var value = 10
}
var firstIntegers = [IntegerReference(), IntegerReference()]
var secondIntegers = firstIntegers
// Modifications to an instance are visible from either array
firstIntegers[0].value = 100
print(secondIntegers[0].value)
// Prints "100"
// Replacements, additions, and removals are still visible
// only in the modified array
firstIntegers[0] = IntegerReference()
print(firstIntegers[0].value)
// Prints "10"
print(secondIntegers[0].value)
// Prints "100"
λ°°μ΄μ Copy-On-Write (COW)
Swift Standard Libraryμ λͺ¨λ κ°λ³ ν¬κΈ° 컬λ μ κ³Ό λ§μ°¬κ°μ§λ‘, λ°°μ΄λ copy-on-write μ΅μ νλ₯Ό μ¬μ©νλ€.
ν λ°°μ΄μ λν μ¬λ¬ 볡μ¬λ³Έμ΄ μλλΌ ν΄λ, κ·Έ μ€ νλλ₯Ό μμ νκΈ° μ κΉμ§λ κ°μ μ μ₯ 곡κ°μ 곡μ νλ€.
λ§μ½ 볡μ¬λ³Έμ λν μμ μ΄ μκΈ°λ©΄, κ·Έ μμ μ λΉλ‘μ 볡μ¬λ³Έμ΄ λ³λμ μ μ₯곡κ°μ λ§λ€μ΄ κ°κ² λκ³ , κ·Έ μ리μμ μμ μ΄ μ΄λ£¨μ΄μ§λ€.
μ¦, λ°°μ΄μ΄ λ€λ₯Έ (λ°°μ΄μ)볡μ¬λ³Έλ€κ³Ό μ μ₯ 곡κ°μ 곡μ νλ κ²½μ°, κ·Έ λ°°μ΄μ λν΄ μ²μμΌλ‘ μ΄λ£¨μ΄μ§λ λ³κ²½ μ°μ°μ βλ°°μ΄μ 볡μ¬βλΌλ λΉμ©μ λ°μμν΅λλ€. μ μ₯ 곡κ°μ μ μΌν μμ κΆμ κ°λ λ°°μ΄λ§μ΄ μ μ리μμ λ³κ²½ μ°μ°μ μνν μ μκΈ° λλ¬Έμ λλ€.
var numbers = [1, 2, 3, 4, 5]
var firstCopy = numbers
var secondCopy = numbers
// The storage for 'numbers' is copied here
numbers[0] = 100
numbers[1] = 200
numbers[2] = 300
// 'numbers' is [100, 200, 300, 4, 5]
// 'firstCopy' and 'secondCopy' are [1, 2, 3, 4, 5]
μ μμμμ, numbers
λ°°μ΄μ κ°μ μ μ₯곡κ°μ 곡μ νλ λ 볡μ¬λ³Έκ³Ό ν¨κ» μμ±λμμ΅λλ€. μλμ λ°°μ΄μΈ numbers
λ°°μ΄μ΄ μμ λ λ, κ·Έ μμ μ numbers
λ λΉλ‘μ μμ λ§μ μ μΌν 볡μ¬λ³Έμ λ§λ€κ³ , κ·Έ λ€μ μμ μμ
μ ν©λλ€. κ·Έ μ΄ν numbers
μ λν μμ μμ
μ μ μ리μμ μνλ©λλ€. κ°μ΄ μμ λ μ μ΄ μλ λ 볡μ¬λ³Έμ μ¬μ ν μλμ μ μ₯ 곡κ°μ 곡μ ν©λλ€.