DevlogπŸ‘©πŸ»‍πŸ’»/Swift

[Swift] μ»¬λ ‰μ…˜ νƒ€μž…(Collection Type) - Dictionary, Set

yujjne 2024. 1. 24. 18:23

TIL 240124

 

https://yujjne.tistory.com/6

 

[Swift] μ»¬λ ‰μ…˜ νƒ€μž…(Collection Type) - Array

TIL 240123 πŸ“μ»¬λ ‰μ…˜ νƒ€μž…(Collection Type)μ΄λž€? μŠ€μœ„ν”„νŠΈλŠ” λ§Žμ€ 수의 데이터λ₯Ό λ¬Άμ–΄μ„œ μ €μž₯ν•˜κ³  관리할 수 μžˆλŠ” μ»¬λ ‰μ…˜ νƒ€μž…μ„ μ œκ³΅ν•œλ‹€. μ»¬λ ‰μ…˜ νƒ€μž…μ˜ μ’…λ₯˜λŠ” λ‹€μŒκ³Ό κ°™λ‹€. Array Dictionary Set νƒ€μž… μ„€

yujjne.tistory.com

 

 

μ €λ²ˆμ—λŠ” μ»¬λ ‰μ…˜ νƒ€μž…κ³Ό Array에 λŒ€ν•΄ μ•Œμ•„λ΄€λŠ”λ°

// 1. νƒ€μž… μΆ”λ‘ 
var dict = ["John": 90, "Alice": 95, "Bob": 80]
var dict = [] // error : νƒ€μž… μΆ”λ‘ μœΌλ‘  빈 λ”•μ…”λ„ˆλ¦¬ 생성 λΆˆκ°€

// 2. Type Annotation 
//[String: Int]λŠ” Dictionary<String, Any>의 μΆ•μ•½ ν‘œν˜„
var dict: [String: Int] = [:]
var dict: [String: Int] = ["John": 90, "Alice": 95, "Bob": 80]

// 3. 빈 Dictionary 생성
var dict: Dictionary<String, Int> = [String: Int]()

// 같은 ν‘œν˜„
var dict: Dictionary <String, Int> = Dictionary<String, Int>()
var dict: Dictionary <String, Int> = [:]
var dict: [String: Int] = Dictionary<String, Int>()
var dict: [String: Int] = [String: Int]()
var dict: [String: Int] = [:]
var dict = [String: Int]()

μ»¬λ ‰μ…˜ νƒ€μž…μ˜ Dictionary, Set의 주둜 μ‚¬μš©λ˜λŠ” λ©”μ„œλ“œμ™€ 속성에 λŒ€ν•΄ μ •λ¦¬ν•΄λ³Όκ²Œμš”!

 

 

λ”•μ…”λ„ˆλ¦¬(Dictionary)

λ”•μ…”λ„ˆλ¦¬λŠ” μš”μ†Œλ“€μ΄ μˆœμ„œ 없이 ν‚€μ™€ κ°’μ˜ 쌍으둜 κ΅¬μ„±λ˜λŠ” μ»¬λ ‰μ…˜ νƒ€μž…μ΄λ‹€.

 

μ €μž₯λ˜λŠ” 값은 항상 킀와 μŒμ„ 이루게 λ˜λŠ”λ°, λ”•μ…”λ„ˆλ¦¬ μ•ˆμ—λŠ” ν‚€κ°€ ν•˜λ‚˜μ΄κ±°λ‚˜ μ—¬λŸ¬ 개일 수 μžˆλ‹€.

단, ν•˜λ‚˜μ˜ λ”•μ…”λ„ˆλ¦¬ μ•ˆμ˜ ν‚€λŠ” 같은 이름을 μ€‘λ³΅ν•΄μ„œ μ‚¬μš©ν•  수 μ—†λ‹€!

 

 

1. λ”•μ…”λ„ˆλ¦¬μ˜ μ„ μ–Έκ³Ό 생성

 

μ΄λ ‡κ²Œ μ½”λ“œ μŠ€νƒ€μΌμ— 따라 λ‹€μ–‘ν•œ ν‘œν˜„μ„ μ‚¬μš©ν•˜μ—¬ λ”•μ…”λ„ˆλ¦¬λ₯Ό μ„ μ–Έν•  수 μžˆλ‹€.

 

λ°°μ—΄κ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ μŠ€μœ„ν”„νŠΈλŠ” μžλ£Œν˜•μ— λ―Όκ°ν•˜κΈ° λ•Œλ¬Έμ— Type을 κΌ­ λͺ…μ‹œν•΄ μ£Όκ±°λ‚˜ μΆ”λ‘ ν•  수 있게 μ΄ˆκΈ°κ°’을 지정해주어야 ν•œλ‹€.

λ”•μ…”λ„ˆλ¦¬μ˜ 킀와 값은 같은 νƒ€μž…μ˜ 데이터가 μ €μž₯λœλ‹€λŠ” 점도 λ‹Ήμ—°ν•˜μ§€λ§Œ μ§€μΌœμ€˜μ•Όν•˜λŠ” 것!

 

 

2. λ”•μ…”λ„ˆλ¦¬μ˜ μ ‘κ·Όκ³Ό μˆ˜μ •

 

λ”•μ…”λ„ˆλ¦¬μ˜ 개수 ν™•μΈν•˜κΈ°

 

count : λ”•μ…”λ„ˆλ¦¬μ˜ μš”μ†Œ 개수 확인

var people: [String: Int] = ["John": 30, "Alice": 25, "Bob": 28]
let numberOfPeople = people.count // 3

 

isEmpty : λ”•μ…”λ„ˆλ¦¬κ°€ λΉ„μ–΄μžˆλŠ”μ§€ μ—¬λΆ€ 확인

var people: [String: Int] = ["John": 30, "Alice": 25, "Bob": 28]
let isDictionaryEmpty = people.isEmpty // false

 

 

λ”•μ…”λ„ˆλ¦¬μ˜ μš”μ†Œμ— μ ‘κ·Όν•˜κΈ°( Key, Value 속성 λ‚˜μ—΄)

 

subscript syntax둜 μ ‘κ·Ό(λŒ€κ΄„ν˜Έ []) : λ°°μ—΄μ— 인덱슀λ₯Ό λ„£μ–΄ κ°’ λ°˜ν™˜

β€» λŸ°νƒ€μž„ μ—λŸ¬κ°€ λ‚˜μ§€ μ•Šλ„λ‘ μΈλ±μŠ€κ°€ μœ νš¨ν•΄μ•Ό ν•œλ‹€!

var people: [String: Int] = ["John": 30, "Alice": 25, "Bob": 28]

// λ”•μ…”λ„ˆλ¦¬ μš”μ†Œ μ ‘κ·Ό
let johnsAge = people["John"] // 30
let leeAge = people["lee"] // nil 

// λ”•μ…”λ„ˆλ¦¬ keys 속성과 values 속성
let allNames = people.keys // Dictionary.Keys(["Alice", "Bob", "John"])
let allAges = people.values // Dictionary.Values([25, 28, 30])

 

λ”•μ…”λ„ˆλ¦¬μ— μš”μ†Œ μΆ”κ°€ν•˜κΈ°

 

subscript syntax

  • λ”•μ…”λ„ˆλ¦¬μ— μƒˆλ‘œμš΄ μš”μ†Œ μΆ”κ°€ 
  • νŠΉμ • ν‚€μ˜ κ°’ λ³€κ²½ κ°€λŠ₯
var people: [String: Int] = ["John": 30, "Alice": 25, "Bob": 28]
people["Charlie"] = 22 // μƒˆλ‘œμš΄ μš”μ†Œ μΆ”κ°€
people["Bob"] = 23 // value μ—…λ°μ΄νŠΈ

 

 

updateValue : νŠΉμ • 킀에 λŒ€ν•œ 값을 μ—…λ°μ΄νŠΈν•˜κ±°λ‚˜ μƒˆλ‘œμš΄ 값을 μΆ”κ°€

var people: [String: Int] = ["John": 30, "Alice": 25, "Bob": 28]

people.updateValue(26, forKey: "Alice") // Alice의 λ‚˜μ΄κ°€ 26으둜 μ—…λ°μ΄νŠΈ
people.updateValue(33, forKey: "David") // DavidλΌλŠ” key와 λ‚˜μ΄κ°€ μΆ”κ°€

 

λ”•μ…”λ„ˆλ¦¬μ— μš”μ†Œ μ œκ±°ν•˜κΈ°

 

subscript syntax : nil ν• λ‹Ήν•˜μ—¬ 제거

var people: [String: Int] = ["John": 30, "Alice": 25, "Bob": 28]
// nil을 ν• λ‹Ήν•˜μ—¬ νŠΉμ • ν‚€ μ‚­μ œ
people["Alice"] = nil // Alice 킀와 값이 제거됨

 

removeValue(forKey:) : νŠΉμ • key μ‚­μ œ

removeAll : 전체 μ‚­μ œ

// νŠΉμ • μš”μ†Œ μ‚­μ œ
let removedAge = people.removeValue(forKey: "Bob") // Bob의 λ‚˜μ΄κ°€ 제거되고 removedAgeμ—λŠ” 제거된 값이 λ°˜ν™˜

// 전체 μ‚­μ œ
people.removeAll()

 

 

λ”•μ…”λ„ˆλ¦¬ λ°˜λ³΅ν•˜κΈ°

 

for-in loop : λ”•μ…”λ„ˆλ¦¬ μˆœνšŒν•˜μ—¬ 전체 κ°’ 확인

for (name, age) in people {
    print("\(name) is \(age) years old.")
}

 

enumerated : μš”μ†Œμ˜ μΈλ±μŠ€μ™€ ν•¨κ»˜ κ°’ 확인

for (index, (name, age)) in people.enumerated() {
    print("Index: \(index), Name: \(name), age: \(age)")
}

 


 

Set(집합)

 

SetλŠ” 같은 νƒ€μž…μ˜ 데이터λ₯Ό μˆœμ„œ 없이 ν•˜λ‚˜μ˜ 묢음으둜 μ €μž₯ν•˜λŠ” ν˜•νƒœμ˜ μ»¬λ ‰μ…˜ νƒ€μž…μ΄λ‹€

 

Set λ‚΄μ˜ 값은 λͺ¨λ‘ μœ μΌν•œ κ°’, 즉 μ€‘λ³΅λœ 값이 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€.

κ·Έλž˜μ„œ Set은 보톡 μˆœμ„œκ°€ μ€‘μš”ν•˜μ§€ μ•Šκ±°λ‚˜ 각 μš”μ†Œκ°€ μœ μΌν•œ 값이어야 ν•˜λŠ” κ²½μš°μ— μ‚¬μš©ν•œλ‹€.

Set의 μš”μ†Œλ‘œλŠ” ν•΄μ‹œ κ°€λŠ₯ν•œ 값이 듀어와야 ν•œλ‹€.(Hashabe ν”„λ‘œν† μ½œ μ€€μˆ˜)

 

1. Set의 μ„ μ–Έκ³Ό 생성

// 빈 Set 생성
var numberSet: Set<Int> = Set<Int>()

// Type Annotation (νƒ€μž… 좔둠은 λ°°μ—΄λ‘œ μΈμ‹λ˜κΈ° λ•Œλ¬Έμ— λΆˆκ°€ν•¨)
var numberSet: Set<Int> = []
// μƒμ„±μž
var numberSet = Set<Int>()

// μƒμ„±μžλ₯Ό μ‚¬μš©ν•œ μ΄ˆκΈ°ν™”
var numberSet: Set<Int> = [1, 2, 3]

λ°°μ—΄κ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ λŒ€κ΄„ν˜Έλ‘œ 값듀을 λ¬Άμ–΄ Set νƒ€μž…μž„μ„ ν‘œν˜„ν•œλ‹€.

[]λ₯Ό λ™μΌν•˜κ²Œ μ“°κΈ° λ•Œλ¬Έμ— νƒ€μž… 좔둠이 λΆˆκ°€ν•˜κ³ , 

λ°°μ—΄κ³Ό 달리 μ€„μ—¬μ„œ ν‘œν˜„ν•  수 μžˆλŠ” Array<Int> λ₯Ό [Int]둜 μ“Έ 수 μ—†λ‹€.

 

 

2. Set의 μ ‘κ·Όκ³Ό μˆ˜μ •

λ©”μ„œλ“œμ™€ ν”„λ‘œνΌν‹°λ‘œ Set에 μ ‘κ·Όκ³Ό μˆ˜μ •ν•  수 μžˆλ‹€.

 

Set의 개수 ν™•μΈν•˜κΈ°

 

count : Set의 μš”μ†Œ 개수 확인

var numbers: Set<Int> = [1, 2, 3, 4, 5]
let count = numbers.count // 5

 

isEmpty : Set이 λΉ„μ–΄μžˆλŠ”μ§€ μ—¬λΆ€ 확인

var numbers: Set<Int> = [1, 2, 3, 4, 5]
let isEmpty = numbers.isEmpty // false

 

contains : Set이 νŠΉμ • μš”μ†Œλ₯Ό ν¬ν•¨ν•˜κ³  μžˆλŠ”μ§€ μ—¬λΆ€ 확인

var numbers: Set<Int> = [1, 2, 3, 4, 5]
let containsTwo = numbers.contains(2) // true

 

 

Set μš”μ†Œ μΆ”κ°€ 및 제거

 

update : μ‚½μž…, ꡐ체, μΆ”κ°€

var set1: Set<Int> = [1,1,2,2,3,3]
set1.update(with: 1) // 1 -> 기쑴에 있던 μš”μ†Œμ΄λ―€λ‘œ 값을 μ˜΅μ…”λ„ νƒ€μž…μœΌλ‘œ 리턴
set1.update(with: 7) // nil -> 기쑴에 μ—†λ˜ μš”μ†Œμ΄λ―€λ‘œ Set에 μš”μ†Œκ°€ μΆ”κ°€λ˜κ³  nil 리턴

 

insert : Set에 μš”μ†Œλ₯Ό μΆ”κ°€

var numbers: Set<Int> = [1, 2, 3, 4, 5]

numbers.insert(6) // (inserted: true, memberAfterInsert: 6)
numbers.insert(1) // 쀑볡일 경우 (inserted: false, memberAfterInsert: 1)

 

remove : Set에 μš”μ†Œλ₯Ό 제거

var numbers: Set<Int> = [1, 2, 3, 4, 5]

// νŠΉμ • μš”μ†Œ μ‚­μ œ
numbers.remove(3) // μ‚­μ œν•œ κ°’ return : 3

// 전체 μ‚­μ œ
numbers.removeAll()

 

 

Set μ •λ ¬
var numbers: Set<Int> = [5, 4, 1, 3, 2]
let sortedNumbers = numbers.sorted() // [1, 2, 3, 4, 5]

μˆœμ„œκ°€ μ—†λŠ” μ»¬λ ‰μ…˜μ΄κΈ° λ•Œλ¬Έμ— μ •λ ¬ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄μ„œ μ •λ ¬ν•  수 μžˆλ‹€.

 

 

Set의 μ—°μ‚°

 

기본적인 집합 연산을 μˆ˜ν–‰ν•  수 μžˆλ‹€.

 

 

  • intersection : (ꡐ집합) 두 μ§‘ν•©μ˜ 곡톡 값을 κ°€μ§€λŠ” μƒˆλ‘œμš΄ 집합을 생성
  • symmetricDifference : (μ—¬μ§‘ν•©μ˜ ν•©) 두 μ§‘ν•©μ˜ 곡톡 값을 μ œμ™Έν•œ μƒˆλ‘œμš΄ 집합을 생성
  • union : (합집합) 두 μ§‘ν•©μ˜ λͺ¨λ“  κ°’μœΌλ‘œ μƒˆλ‘œμš΄ 집합을 생성
  • subtracting : (차집합) νŠΉμ • μ§‘ν•©μ˜ 곡톡 값을 μ œμ™Έν•œ μƒˆλ‘œμš΄ 집합을 생성
let oddSet: Set<Int> = [1, 3, 5, 7, 9]
let evenSet: Set<Int> = [0, 2, 4, 6, 8]
let singleSet: Se<Int> = [2, 3, 5, 7]

oddSet.intersection(evenSet).sorted()
// []

oddSet.symmetricDifference(singleSet).sorted()
// [1, 2, 9]

oddSet.union(evenSet).sorted()
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

oddSet.subtracting(singleSet).sorted()
// [1, 9]
 
 
 
Set의 포함관계 μ—°μ‚°

 

  • isSubset(of:) : λ‹€λ₯Έ μ§‘ν•©μ˜ 뢀뢄집합인지 확인
  • isSuperset(of:) : λ‹€λ₯Έ μ§‘ν•©μ˜ 전체집합인지 확인
  • isDisjoint(with:) : κ³΅ν†΅λœ μš”μ†Œκ°€ μ—†λŠ”μ§€ 확인
let setA: Set<Int> = [1, 2, 3, 4, 5]
let setB: Set<Int> = [3, 4, 5, 6, 7]
let setC: Set<Int> = [8, 9, 10]

// setAλŠ” setB의 뢀뢄집합인가?
let isSubset = setA.isSubset(of: setB) // true

// setBλŠ” setA의 전체집합인가?
let isSuperset = setB.isSuperset(of: setA) // true

// setB와 setCλŠ” κ³΅ν†΅λœ μš”μ†Œκ°€ μ—†λŠ”κ°€?
let isDisjoint = setB.isDisjoint(with: setC) // true

 

 

Set 반볡
  • for - in loop
  • for Each λ©”μ„œλ“œ
var numbers: Set<Int> = [1, 2, 3, 4, 5]

for number in numbers {
    print(number)
}

numbers.forEach { number in
    print(number)
}

 

 

 

 


✏️ 정리

Collection type

: μ—¬λŸ¬ 개의 κ°’ λ˜λŠ” 객체λ₯Ό κ·Έλ£Ήν™”ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” 데이터 νƒ€μž…μ΄λ‹€. μ œλ„€λ¦­ν•œ ν˜•νƒœλ‘œ κ΅¬ν˜„λ˜μ–΄ μžˆμ–΄, λ‹€μ–‘ν•œ 데이터 νƒ€μž…μ„ 담을 수 μžˆλ‹€. λ‹€μ–‘ν•œ λ‚΄μž₯ ν•¨μˆ˜μ™€ 속성을 μ œκ³΅ν•˜μ—¬ 데이터λ₯Ό 효율적으둜 λ‹€λ£° 수 μžˆλ‹€.

 

 

Array

  • μˆœμ„œκ°€ μžˆλŠ” 리슀트 ν˜•νƒœμ˜ μ»¬λ ‰μ…˜
  • 각 μš”μ†ŒλŠ” 인덱슀λ₯Ό μ‚¬μš©ν•˜μ—¬ μ ‘κ·Ό
  • var fruits: [String] = ["Apple", "Banana", "Cherry"]

Dictionary

  • 킀와 κ°’μ˜ 쌍으둜 이루어진 μ»¬λ ‰μ…˜ νƒ€μž…
  • var capitals: [String: String] = ["Korea": "Seoul", "Japan": "Tokyo"]

Set

  • SetλŠ” μˆœμ„œκ°€ μ—†κ³ , 멀버가 μœ μΌν•œ 것을 보μž₯ν•˜λŠ” μ»¬λ ‰μ…˜ νƒ€μž…
  • var colors: Set<String> = ["Red", "Green", "Blue"]