Swift

[ SWIFT ] 데이터 νƒ€μž… κ³ κΈ‰ (2) - μ»¬λ ‰μ…˜ νƒ€μž… <λ°°μ—΄, λ”•μ…”λ„ˆλ¦¬, μ„ΈνŠΈ>

Forest Yun 2021. 7. 20. 17:47
728x90

κ³΅λΆ€ν•œ λ‚΄μš©μ„ μ •λ¦¬ν•œ κΈ€μž…λ‹ˆλ‹€.

 

 

 

데이터 νƒ€μž… κ³ κΈ‰(2) - μ»¬λ ‰μ…˜ν˜•

  1. μ»¬λ ‰μ…˜ νƒ€μž…
  2. λ°°μ—΄
  3. λ”•μ…”λ„ˆλ¦¬
  4. μ„ΈνŠΈ

 

 

 


1. μ»¬λ ‰μ…˜ νƒ€μž… Collection Types 

SWIFTμ—μ„œ μ»¬λ ‰μ…˜ νƒ€μž…(Collection Type)은 데이터 λ¬ΆμŒμ„ μ˜λ―Έν•œλ‹€. SWIFTμ—μ„œλŠ” 3κ°€μ§€μ˜ μ»¬λ ‰μ…˜ νƒ€μž…μ„ μ œκ³΅ν•œλ‹€. 이 μ„Έ 가지 μ»¬λ ‰μ…˜ νƒ€μž… λͺ¨λ‘ generic collectionsλ₯Ό κ΅¬ν˜„ν•˜κΈ° λ•Œλ¬Έμ— ν•˜λ‚˜μ˜ μ§€μ •λœ νƒ€μž…μ˜ 데이터λ₯Ό 담을 수 μžˆλ‹€.

 

  • μ’…λ₯˜λ‘œλŠ” λ°°μ—΄, λ”•μ…”λ„ˆλ¦¬, μ„ΈνŠΈ 등이 μžˆλ‹€.
  • let ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄ μƒμˆ˜λ‘œ μ„ μ–Έν•˜λ©΄ λ³€κ²½ν•  수 μ—†λŠ” μ»¬λ ‰μ…˜ νƒ€μž…μ΄ λœλ‹€.
  • var ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄ λ³€μˆ˜λ‘œ μ„ μ–Έν•˜λ©΄ λ³€κ²½ν•  수 μžˆλŠ” μ»¬λ ‰μ…˜ νƒ€μž…μ΄ λœλ‹€.
μ œλ„€λ¦­ Generic
μ œλ„€λ¦­ μ½”λ“œλ‘œ κ΅¬ν˜„λœ 것듀은 μ–΄λ–€ νƒ€μž…μ΄λ“  담을 수 있게 지정할 수 μžˆμŒμ„ μ˜λ―Έν•œλ‹€.
μŠ€μœ„ν”„νŠΈμ˜ κ°€μž₯ 큰 νŠΉμ§• 쀑 ν•˜λ‚˜μ΄λ‹€. κ²Œλ‹€κ°€ μƒλ‹Ήν•œ 수의 μŠ€μœ„ν”„νŠΈ ν‘œμ€€ λΌμ΄λΈŒλŸ¬λ¦¬λŠ” μ œλ„€λ¦­ μ½”λ“œλ‘œ κ΅¬ν˜„λ˜μ–΄ μžˆλ‹€.
예λ₯Ό λ“€μ–΄ μ»¬λ ‰μ…˜ νƒ€μž… 쀑 ν•˜λ‚˜μΈ arrayλŠ” Int, String λ“± μ–΄λ–€ νƒ€μž…μ΄λ“ μ§€ 담을 수 μžˆλ‹€.

 

 

 

 

 

 


2. λ°°μ—΄ Array

  • 같은 νƒ€μž…μ˜ 데이터λ₯Ό 일렬둜 λ‚˜μ—΄ν•œ ν›„ μˆœμ„œλŒ€λ‘œ μ €μž₯ν•˜λŠ” ν˜•νƒœμ˜ μ»¬λ ‰μ…˜ νƒ€μž…μ΄λ‹€.
  • Cμ–Έμ–΄ λ“± λ‹€λ₯Έ μ–Έμ–΄λ“€κ³Ό λ‹€λ₯΄κ²Œ λ°°μ—΄μž„μ—λ„ var ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ μš”μ†Œμ˜ μ‚½μž… μ‚­μ œκ°€ μžμœ λ‘­λ‹€.

 

λ°°μ—΄ μ„ μ–Έ 및 μ ‘κ·Ό 방법

//λ³€κ²½ λΆˆκ°€λŠ₯ν•œ λ°°μ—΄ μ„ μ–Έ
let immutableArray: Array<String> = Array<String>()

//λ³€κ²½ κ°€λŠ₯ν•œ λ°°μ—΄ μ„ μ–Έ
var mutableArray: Array<String> = Array<String>()

//λ‹€μ–‘ν•œ λ°°μ—΄ μ„ μ–Έ 및 μ΄ˆκΈ°ν™” 방법
var array1: Array<Int> = Array<Int>()
var array2: [Int] = Array<Int>()
var array3: [Int] = [Int]()
var array4: [Int] = []
var array5: [Int] = [1, 2, 3]
//νƒ€μž… μΆ”λ‘  κΈ°λŠ₯이 있기 λ•Œλ¬Έμ— νƒ€μž…μ„ μƒλž΅ν•  μˆ˜λ„ μžˆλ‹€.

//λ°°μ—΄ μ ‘κ·Ό
print(array5[0])
print(array5[0 ... 3])

array[2] = 5
array[1 ... 2] = [4, 8]

 

 

λ°°μ—΄μ˜ λ©”μ„œλ“œ 및 ν”„λ‘œνΌν‹°

ν”„λ‘œνΌν‹° λ˜λŠ”
λ©”μ„œλ“œλͺ…
μ„€λͺ… μ˜ˆμ‹œ
.isEmpty 빈 μ—¬λΆ€ 확인 κ°€λŠ₯. Bool ν˜•νƒœλ‘œ λ°˜ν™˜ print(emptyArray.isEmpty) //true λ˜λŠ” false λ°˜ν™˜
.count λ°°μ—΄μ˜ μš”μ†Œ 개수 확인 κ°€λŠ₯ print(hasThrArray.count). //3λ°˜ν™˜
.first λ°°μ—΄μ˜ 맨 처음 μš”μ†Œλ₯Ό λ°˜ν™˜
.last λ°°μ—΄μ˜ 맨 λ§ˆμ§€λ§‰ μš”μ†Œλ₯Ό λ°˜ν™˜
append(_: ) λ°°μ—΄μ˜ 맨 뒀에 μš”μ†Œλ₯Ό μΆ”κ°€ν•œλ‹€. testArray.append(1)
testArray.append(contentsOf: [2, 3])
testArray.append(contentsOf: 4...10)
//4λΆ€ν„° 10κΉŒμ§€ μΆ”κ°€λœλ‹€.
insert(_: at:) μ›ν•˜λŠ” μœ„μΉ˜μ— μš”μ†Œλ₯Ό μΆ”κ°€ν•œλ‹€.
ν•΄λ‹Ή μœ„μΉ˜μ— 있던 μš”μ†ŒλŠ” λ’€λ‘œ λ°€λ €λ‚œλ‹€.
var test: [Int] = [1, 2]

test.insert(10, at: 1)  //[1, 10, 2]
test.insert(contentsOf: [11, 12] at: 2) //[1, 10, 11, 12, 2]
test.insert(contensOf: 100...102 at: 4)
//[1, 10, 11, 12, 100, 101, 102, 2]
firstIndex(of:) ν•΄λ‹Ή μΈμˆ˜μ™€ μΌμΉ˜ν•˜λŠ” μš”μ†Œ 쀑 첫 번째 μš”μ†Œμ˜ 인덱슀 λ°˜ν™˜ var test: [String] = ["kim", "yoon", "kim", "lee"] 

print(test.firstIndex("kim"))  //인덱슀 0 λ°˜ν™˜
print(test.lastIndex("kim")) //인덱슀 2 λ°˜ν™˜
lastIndex(of:) ν•΄λ‹Ή μΈμˆ˜μ™€ μΌμΉ˜ν•˜λŠ” μš”μ†Œ 쀑 λ§ˆμ§€λ§‰ μš”μ†Œμ˜ 인덱슀 λ°˜ν™˜
removeFirst([k:]) 첫 번째 μš”μ†Œ μ‚­μ œ ν›„ λ°˜ν™”
k: -> μ•žμ—μ„œ k개의 μš”μ†Œ μ‚­μ œ ν›„ λ°˜ν™˜
let firstItem:String = names2.removeFirst() //첫 번째 μš”μ†Œλ₯Ό μ‚­μ œ ν›„ λ°˜ν™˜
let lastItem:String = names2.removeLast() //λ§ˆμ§€λ§‰ μš”μ†Œλ₯Ό μ‚­μ œ ν›„ λ°˜ν™˜
let indexZeroItem:String = names2.remove(at: 0)// ν•΄λ‹Ή 인덱슀 μš”μ†Œ μ‚­μ œ ν›„ λ°˜ν™”


print(firstItem, lastItem, indexZeroItem)
removeLast([k:]) λ§ˆμ§€λ§‰ μš”μ†Œ μ‚­μ œ ν›„ λ°˜ν™˜
k: -> λ’€μ—μ„œ k개의 μš”μ†Œ μ‚­μ œ ν›„ λ°˜ν™˜
remove(at:) ν•΄λ‹Ήν•˜λŠ” 인덱슀의 μš”μ†Œλ₯Ό μ‚­μ œ ν›„ λ°˜ν™˜

 

 

 

 

 

 


3. λ”•μ…”λ„ˆλ¦¬ Dictionary

  • μˆœμ„œ 없이 킀와 κ°’μ˜ 쌍으둜 κ΅¬μ„±λ˜λŠ” μ»¬λ ‰μ…˜ νƒ€μž…
  • ν‚€λŠ” μœ μΌν•œ 값이어야 ν•œλ‹€.
  • λ°°μ—΄κ³Ό λ‹€λ₯΄κ²Œ λ”•μ…”λ„ˆλ¦¬ 내뢀에 μ—†λŠ” ν‚€λ‘œ 접근해도 였λ₯˜κ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€. nil λ°˜ν™˜. default 값을 μ„€μ •ν•  μˆ˜λ„ μžˆλ‹€.

 

λ”•μ…”λ„ˆλ¦¬μ˜ μ„ μ–Έκ³Ό μ ‘κ·Ό 방법

//λ³€κ²½κ°€λŠ₯ν•œ λ”•μ…”λ„ˆλ¦¬ μ„ μ–Έ
var mutableDictionary1: [Sting: Int] = [:]

//λ³€κ²½ λΆˆκ°€λŠ₯ν•œ λ”•μ…”λ„ˆλ¦¬ μ„ μ–Έ
let mutableDictionary2: [Sting: Int] = [:]

//λ”•μ…”λ„ˆλ¦¬μ˜ μ„ μ–Έ 방법 (keyκ°€ String νƒ€μž…μ΄κ³  valueκ°€ Int일 λ•Œ)
var dictionary1: Dictionary<String, Int> = Dictionary<String>()
var dictionary2: [String: Int] = [String: Int]()  //:주의
var dictionary3: [String: Int] = [:]
var dictionary4: [String: Int] = ["test1": 1, "test2":2]
//νƒ€μž… μΆ”λ‘  κΈ°λŠ₯이 있기 λ•Œλ¬Έμ— νƒ€μž…μ„ μƒλž΅ν•  μˆ˜λ„ μžˆλ‹€.

//νƒ€μž… λ³„μΉ­μœΌλ‘œ 더 λ‹¨μˆœν•˜κ²Œ ν‘œν˜„ν•  μˆ˜λ„ μžˆλ‹€.
typealias StringIntDictionary = [String: Int]
var dictionary5: StringIntDictionary = StringIntDictionary()

//λ”•μ…”λ„ˆλ¦¬ μš”μ†Œ μ ‘κ·Ό 방법
print(dictionary4["test1"])  //1 좜λ ₯
print(dictionary4["88yhtserof"]) //nil 좜λ ₯
print(dictionary4["88yhtserof", default: 0]) //nil λŒ€μ‹  0 좜λ ₯

 

 

λ”•μ…”λ„ˆλ¦¬μ˜ λ©”μ„œλ“œ 및 ν”„λ‘œνΌν‹°

ν”„λ‘œνΌν‹° λ˜λŠ”
λ©”μ„œλ“œλͺ…
μ„€λͺ…  μ˜ˆμ‹œ
.isEmpty λ”•μ…”λ„ˆλ¦¬κ°€ λΉ„μ–΄μžˆλŠ”μ§€ Bool νƒ€μž…μœΌλ‘œ λ°˜ν™˜ print(emptyDictionary.isEmpty//true
.count λ”•μ…”λ„ˆλ¦¬ μš”μ†Œμ˜ 개수 λ°˜ν™˜ print(hasThrDictionary.count). //3λ°˜ν™˜
removeValue(forkey:) 킀에 ν•΄λ‹Ήν•˜λŠ” 값을 제거 ν›„ λ°˜ν™˜ν•œλ‹€.
λ³€μˆ˜ λ˜λŠ” μƒμˆ˜μ— ν• λ‹Ήν•  경우 nil 값이 λ°˜ν™˜λ μˆ˜ μžˆμŒμ„ μΈμ‹ν•˜μ—¬ ? ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.
var returnValue: Int?
       = test.removeValue(forKey: "kim")

print(test.removeValue(forKey: "88yhtserof") )


//값이 λ°˜ν™˜λ  경우 ifλ¬Έ 톡과, nill이 λ°˜ν™˜λ  경우 else λ¬Έ μ‹€ν–‰
if let returnValue = test.removeValue(forKey: "lee"){
    print("remove")
}
else{
    print("No found")
}

updateValue(_: forKey:) ν•΄λ‹Ή 킀에 ν• λ‹Ήλœ 값을 λ³€κ²½ν•˜λŠ” λ©”μ„œλ“œ test.updateValue(888, forKey: "test")

 

 

 

 

 

 


4. μ„ΈνŠΈ Set

  • 같은 νƒ€μž…μ˜ 데이터λ₯Ό μˆœμ„œ 없이 ν•˜λ‚˜μ˜ 묢음으둜 μ €μž₯ν•˜λŠ” ν˜•νƒœμ˜ μ»¬λ ‰μ…˜ νƒ€μž…
  • μ„ΈνŠΈ λ‚΄μ˜ 값은 λͺ¨λ‘ μœ μΌν•œ κ°’
  • λ”°λΌμ„œ μˆœμ„œκ°€ μ€‘μš”ν•˜μ§€ μ•Šκ±°λ‚˜ 각 μš”μ†Œκ°€ μœ μΌν•œ 값이어야 ν•  λ•Œ 주둜 μ‚¬μš©ν•œλ‹€.
  • λ°°μ—΄κ³Ό λ‹€λ₯΄κ²Œ 생성 μ‹œ μΆ•μ–‘ν˜•μ„ μ‚¬μš©ν•  수 μ—†λ‹€.
  • νƒ€μž… μΆ”λ‘  κΈ°λŠ₯을 μ‚¬μš©ν•  수 μ—†λ‹€.
  • μ„ΈνŠΈλŠ” μžμ‹  λ‚΄μ£Όμ˜ 값듀이 λͺ¨λ‘ μœ μΌν•¨μ„ 보μž₯ν•˜λ―€λ‘œ 집합 관계λ₯Ό ν‘œν˜„ν•˜κ³ μž ν•  λ•Œ μœ μš©ν•˜κ²Œ 쓰인닀. 
  • ꡐ집합, 합집합 λ“± 연산에 용이

 

 

μ„ΈνŠΈμ˜ μ„ μ–Έ 및 μ΄ˆκΈ°ν™”

//λ³€κ²½ λΆˆκ°€λŠ₯ν•œ μ„ΈνŠΈ μ„ μ–Έ
let immutableSet: Set<String> = Set<String>()

//λ³€κ²½ κ°€λŠ₯ν•œ μ„ΈνŠΈ μ„ μ–Έ
var mutableSet: Set<String> = Set<String>()

//μ„ΈνŠΈ μ„ μ–Έ 및 μ΄ˆκΈ°ν™” 방법
var set1: Set<String> = Set<String>()
var set2: Set<String> = []
var set3: Set<Int> = [1, 2, 3]
//μ„ΈνŠΈλŠ” μΆ•μ•½ν˜•μ„ μ‚¬μš©ν•  수 μ—†λ‹€

 

μ„ΈνŠΈμ˜ λ©”μ„œλ“œ 및 ν”„λ‘œνΌν‹°

ν”„λ‘œνΌν‹° λ˜λŠ”
λ©”μ„œλ“œλͺ…
μ„€λͺ… μ˜ˆμ‹œ
.isEmpty μ„ΈνŠΈκ°€ λΉ„μ–΄μžˆλŠ”μ§€ Bool νƒ€μž…μœΌλ‘œ λ°˜ν™˜ print(testSet.isEmpty)
.count μ„ΈνŠΈ μš”μ†Œμ˜ 개수λ₯Ό λ°˜ν™˜ν•œλ‹€. print(testSet.count)
insert(_:) μ„ΈνŠΈμ— 주어진 값을 μš”μ†Œλ‘œ μΆ”κ°€ν•œλ‹€. testSet3.insert("A")
remove(_:) ν•΄λ‹Ήν•˜λŠ” μš”μ†Œλ₯Ό μ‚­μ œ ν›„ λ°˜ν™˜ν•œλ‹€.
ν•΄λ‹Ήν•˜λŠ” μš”μ†Œκ°€ μ—†λ‹€λ©΄ nil을 λ°˜ν™˜ν•œλ‹€.
λ³€μˆ˜ λ˜λŠ” μƒμˆ˜μ— remove()둜 λ°˜ν™˜λ˜λŠ” 값을 ν• λ‹Ήν•˜λ €λ©΄ nil이 λ°˜ν™˜λ  수 μžˆμŒμ„ μΈμ‹ν•˜κ³  ? ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.
print(testSet.remove("kim"))


let
removeTest: String?
      =
testSet.remove("sandra")

if let test = testSet.remove("lee") {
   print("Success")
}
else{ //nil이 λ°˜ν™˜λœ 경우
    print("Fail")
}
sorted() μ •λ ¬λœ 배열을 λ°˜ν™˜ν•œλ‹€. print(test.sorted()) //[1, 2, 3, 4]
intersection(_:) ꡐ집합
두 개의 μ„ΈνŠΈμ˜ κ³΅ν†΅λœ λΆ€λΆ„λ§ŒμœΌλ‘œ μƒˆ μ„ΈνŠΈλ₯Ό 생성할 λ•Œ μ‚¬μš©
symmetricDifference(_:) 두 μ§‘ν•©μ˜ μƒλŒ€ μ—¬μ§‘ν•©μ˜ ν•©(배타적 논리합)
-두 개의 μ„ΈνŠΈ κ΅μ§‘ν•©μ˜ 여집합
ꡐ집합이 μ•„λ‹Œ μ–‘μͺ½ μ„ΈνŠΈμ˜ κ°’μœΌλ‘œ μƒˆ μ„ΈνŠΈλ₯Ό 생성할 λ•Œ μ‚¬μš© 
union(_:) 합집합
두 μ„ΈνŠΈ λͺ¨λ‘μ˜ κ°’μœΌλ‘œ μƒˆ μ„ΈνŠΈλ₯Ό 생성할 λ•Œ μ‚¬μš©
subtracting(_:) 차집합 a = [1, 2, 3]
b = [2, 3]

a.subtracting(b)
//a-b = [1]
isDisjoint(with:) μ„œλ‘œ 배타적인가
두 μ„ΈνŠΈκ°€ κ³΅ν†΅λ˜λŠ” 값이 μ—†λŠ”μ§€ μžˆλŠ”μ§€ Boolν˜•νƒœλ‘œ λ°˜ν™˜ν•œλ‹€.
κ³΅ν†΅λ˜λŠ” 뢀뢄이 μ—†λ‹€λ©΄ true
κ³΅ν†΅λ˜λŠ” 뢀뢄이 μžˆλ‹€λ©΄ false
A.isSupset(of: B) Aκ°€ B의 λΆ€λΆ„ 집합인가? (ν•˜μœ„ 집합인가)
A.isSuperset(of: B) Aκ°€ B의 μƒμœ„ 집합인가? (전체 집합인가?)
A.isStrictSubset(of:) Aκ°€ B의 λΆ€λΆ„ 집합인가? 단, 전체집합이면 μ•ˆλ¨. a = [1, 2, 3]
b = [2, 3]
c = [1, 2, 3]


b.isStrictSubset(of: a) //true
a.isStrictSubset(of: c) //false
a.isStrictSubset(of: a) //false

 

 

 

 

집합연산과 포함관계 μ—°μ‚° μ‚¬μš©

//집합 μ—°μ‚°
let classAStudents: Set<String> = ["88yhtserof", "kim", "lee"]
let classBStudents: Set<String> = ["ari", "lee", "kim", "renee"]

//ꡐ집합
let intersectSet: Set<String>
    = classAStudents.intersection(classBStudents)
print(intersectSet)

//μ—¬μ§‘ν•©μ˜ ν•©(배타적 논리합) - κ΅μ§‘ν•©μ˜ 여집합
let symmetricDiffSet: Set<String>
    = classAStudents.symmetricDifference(classBStudents)
print(symmetricDiffSet)

//합집합
let unionSet: Set<String> = classAStudents.union(classBStudents)
print(unionSet)

//차집합
let subtractSet: Set<String> = classAStudents.subtracting(classBStudents)
print(subtractSet)  //john

print(unionSet.sorted()) //sorted λ©”μ„œλ“œλ₯Ό ν†΅ν•˜μ—¬ μ •λ ¬λœ 배열을 λ°˜ν™˜


//포함관계 μ—°μ‚°
let bird: Set<String> = ["뀑", "λ‹­", "갈맀기"]
let mammal: Set<String> = ["개", "λ°˜λ‹¬κ°€μŠ΄κ³°", "토끼"]
let animal: Set<String> = bird.union(mammal) //합집합

print(bird.isDisjoint(with: mammal))  //μ„œλ‘œ λ°°νƒ€μ μΈκ°€μš”? true
print(bird.isSubset(of: animal)) // μƒˆκ°€ λ™λ¬Όμ˜ λΆ€λΆ„μ§‘ν•©μΈκ°€μš”? true
print(animal.isSuperset(of: mammal)) //동물은 포유λ₯˜μ˜ μ „μ²΄μ§‘ν•©μΈκ°€μš”? true
print(animal.isSuperset(of: bird)) //동물은 μƒˆμ˜ μ „μ²΄μ§‘ν•©μΈκ°€μš”? true
print(animal.isStrictSubset(of: bird)) //false
print(animal == bird)  //false

 

 

 

 

 

 

 

 

 

μ•Όκ³° - μŠ€μœ„ν”„νŠΈ ν”„λ‘œκ·Έλž˜λ° 5판 (SWIFT5)
docs.swift.org
https://docs.swift.org/swift-book/LanguageGuide/CollectionTypes.html
728x90