๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ Today I Learned/Swift ๋ฌธ๋ฒ•

[Swift] ๋ฐฐ์—ด, ์„ธํŠธ, ๋”•์…”๋„ˆ๋ฆฌ

by Joseph Seong 2023. 12. 7.

 

 

๋ฐฐ์—ด, ์„ธํŠธ, ๋”•์…”๋„ˆ๋ฆฌ

 

๋ฐฐ์—ด (Array)

 

  • ๋™์ผํ•œ ํƒ€์ž…์˜ ์š”์†Œ๋“ค์„ ์ €์žฅํ•˜๋Š” ์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ์ปฌ๋ ‰์…˜
  • ๋ฐฐ์—ด์€ ํŠน์ • ์š”์†Œ์˜ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ ‘๊ทผํ•˜๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋Š” ๋™์ ์œผ๋กœ ์กฐ์ ˆ๋œ๋‹ค.
  • ์ธ๋ฑ์Šค(index)๋Š” 0 ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค.
  • ์ฒ˜์Œ์— ์„ ์–ธํ•  ๋•Œ(์ดˆ๊ธฐํ™”ํ•  ๋•Œ) ๋ฐฐ์—ด์˜ ๊ธธ์ด๋ฅผ ๋ฏธ๋ฆฌ ์ง€์ •ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

๋ฐฐ์—ด ์ƒ์„ฑํ•˜๊ธฐ

// ๋ฐฐ์—ด ์ƒ์„ฑํ•˜๊ธฐ
// 1. ํƒ€์ž… ์ถ”๋ก ์œผ๋กœ ์ƒ์„ฑํ•˜๊ธฐ
var array1 = [1, 2, 3]
var array2 = [] // error! ํƒ€์ž… ์ถ”๋ก ์œผ๋ก  ๋นˆ ๋ฐฐ์—ด ์ƒ์„ฑ ๋ถˆ๊ฐ€
 
 
// 2. ํƒ€์ž… Annotation์œผ๋กœ ์ƒ์„ฑํ•˜๊ธฐ
var array3: [Int] = [1, 2, 3]
var array4: [Int] = [] //๋นˆ ๋ฐฐ์—ด ์ƒ์„ฑ
 
 
// 3. ์ƒ์„ฑ์ž๋กœ ์ƒ์„ฑํ•˜๊ธฐ
var array5 = Array<Int>()
var array6 = [Int]()
var array7 = [Int](repeating: 0, count: 10)   //์ƒ์„ฑ๊ณผ ๋™์‹œ์— 10๊ฐœ Element ์ƒ์„ฑ ๋ฐ 0์œผ๋กœ ์ดˆ๊ธฐํ™”

 

๋ฐฐ์—ด ๊ฐฏ์ˆ˜ ํ™•์ธํ•˜๊ธฐ

// ๋ฐฐ์—ด ๊ฐฏ์ˆ˜ ํ™•์ธํ•˜๊ธฐ
var array1 = [1, 2, 3]

let count: Int = array1.count      // ๋ฐฐ์—ด ๊ฐฏ์ˆ˜ ํ™•์ธ : 3
let isEmpty: Bool = array1.isEmpty // ๋ฐฐ์—ด ๋น„์—ˆ๋Š”์ง€ ํ™•์ธ : false

 

๋ฐฐ์—ด ์š”์†Œ์— ์ ‘๊ทผํ•˜๊ธฐ

// ๋ฐฐ์—ด ์š”์†Œ์— ์ ‘๊ทผํ•˜๊ธฐ
var array1 = [1, 2, 3]

// 1. Subscript๋กœ ์ ‘๊ทผํ•˜๊ธฐ
array1[0]        // 1
array1[1]        // 2
 
// 2. ๋ฒ”์œ„๋กœ ์ ‘๊ทผํ•˜๊ธฐ
array1[0...1]    // [1, 2]
 
// 3. ์†์„ฑ์œผ๋กœ ์ ‘๊ทผํ•˜๊ธฐ
array1.first     // Optional(1)
array1.last      // Optional(3)

 

๋ฐฐ์—ด ์š”์†Œ ์ถ”๊ฐ€ํ•˜๊ธฐ

// ๋ฐฐ์—ด์— ์š”์†Œ ์ถ”๊ฐ€ํ•˜๊ธฐ
// 1. append : ๋์— ์ถ”๊ฐ€
var array1 = [1, 2, 3]
array1.append(4)                            // [1, 2, 3, 4]
array1.append(contentsOf: [5, 6, 7])        // contentsOf๋กœ ์—ฌ๋Ÿฌ๊ฐœ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ [1, 2, 3, 4, 5, 6, 7]
 
// 2. insert : ์ค‘๊ฐ„์— ์ถ”๊ฐ€
var array2 = [1, 2, 3]
array2.insert(0, at: 0)                      // at์€ ์œ„์น˜ [0, 1, 2, 3]
array2.insert(contentsOf: [10, 100], at: 2)  // [0, 1, 10, 100, 2, 3 ]

 

๋ฐฐ์—ด ์š”์†Œ ๋ณ€๊ฒฝํ•˜๊ธฐ

// ๋ฐฐ์—ด์— ์š”์†Œ ๋ณ€๊ฒฝํ•˜๊ธฐ
// 1. Subscript๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ
var array1 = [1, 2, 3]
array1[0] = 10                       // [10, 2, 3]
array1[0...2] = [10, 20, 30]         // [10, 20, 30]
array1[0...2] = [0]                  // [0]
array1[0..<1] = []                   // []
 
// 2. replaceSubrange๋กœ ๋ฐ”๊พธ๊ธฐ (๋ฒ”์œ„ ๋ณ€๊ฒฝ ์‹œ)
var array2 = [1, 2, 3]
array2.replaceSubrange(0...2, with: [10, 20, 30])     // [10, 20, 30]
array2.replaceSubrange(0...2, with: [0])              // [0]
array2.replaceSubrange(0..<1, with: [])               // []

 

๋ฐฐ์—ด ์š”์†Œ ์‚ญ์ œํ•˜๊ธฐ

// ๋ฐฐ์—ด์— ์š”์†Œ ์‚ญ์ œ
// 1. ์ผ๋ฐ˜์ ์ธ ์‚ญ์ œํ•˜๊ธฐ
var array1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
 
array1.remove(at: 2)             // [1, 2, 4, 5, 6, 7, 8, 9] 
array1.removeFirst()             // [2, 4, 5, 6, 7, 8, 9]   
array1.removeFirst(2)            // ์•ž์— ๋ช‡๊ฐœ๋ฅผ ์ œ๊ฑฐํ• ๊ฑด์ง€ [5, 6, 7, 8, 9]
array1.removeLast()              // [5, 6, 7, 8]
array1.popLast()                 // [5, 6, 7] 
array1.removeLast(2)             // [5]
array1.removeAll()               // [] 
 
// 2. ํŠน์ • ๋ฒ”์œ„ ์‚ญ์ œํ•˜๊ธฐ
var array2 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
 
array2.removeSubrange(1...3)     // [1, 5, 6, 7, 8, 9] 
array2[0..<2] = []               // [6, 7, 8, 9]

 

๋ฐฐ์—ด ๋น„๊ตํ•˜๊ธฐ

// ๋ฐฐ์—ด ๋น„๊ตํ•˜๊ธฐ
var array1 = [1, 2, 3]
var array2 = [1, 2, 3]
var array3 = [1, 2, 3, 4, 5,]
 
array1 == array2                    //true
array1.elementsEqual(array3)        //false

 

๋ฐฐ์—ด ์ •๋ ฌํ•˜๊ธฐ

// ๋ฐฐ์—ด ์ •๋ ฌํ•˜๊ธฐ
let array1 = [1, 5, 3, 8, 6, 10, 14]
 
// 1. sort : ๋ฐฐ์—ด์„ ์ง์ ‘ "์˜ค๋ฆ„์ฐจ์ˆœ"์œผ๋กœ ์ •๋ ฌ
array1.sort()                                         // [1, 3, 5, 6, 8, 10, 14]
 
// 1-1. sort + ํด๋กœ์ € : ๋ฐฐ์—ด์„ ์ง์ ‘ "๋‚ด๋ฆผ์ฐจ์ˆœ"์œผ๋กœ ์ •๋ ฌ
array1.sort(by: >)                                    // [14, 10, 8, 6, 5, 3, 1]
 
 
// 2. sorted : ์›๋ณธ์€ ๊ทธ๋Œ€๋กœ ๋‘๊ณ , "์˜ค๋ฆ„์ฐจ์ˆœ"์œผ๋กœ ์ •๋ ฌ๋œ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด ๋ฆฌํ„ด
let sortedArray = array1.sorted()                     // [1, 3, 5, 6, 8, 10, 14]
 
// 2-1. sorted + ํด๋กœ์ € : ์›๋ณธ์€ ๊ทธ๋Œ€๋กœ ๋‘๊ณ , "๋‚ด๋ฆผ์ฐจ์ˆœ"์œผ๋กœ ์ •๋ ฌ๋œ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด ๋ฆฌํ„ด
let sortedArray2 = array1.sorted(by: >)               // [14, 10, 8, 6, 5, 3, 1]

 

 

์„ธํŠธ (Set)

 

  • Set๋Š” ์ง‘ํ•ฉ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.
  • Set๋Š” ์ˆœ์„œ๋ฅผ ์ •์˜ํ•˜์ง€ ์•Š๊ณ  ๋™์ผํ•œ ํƒ€์ž…์˜ ๊ฐ’์„ ์ €์žฅ
  • ํ•ญ๋ชฉ์˜ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ํ•ญ๋ชฉ์ด ํ•œ ๋ฒˆ๋งŒ ํ‘œ์‹œ๋˜๋„๋ก ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐฐ์—ด ๋Œ€์‹  ์ง‘ํ•ฉ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์„ธํŠธ ์•ˆ์— ์žˆ๋Š” ๋ชจ๋“  ๊ฐ’์€ ๊ณ ์œ (unique)ํ•ด์•ผํ•˜๋ฏ€๋กœ ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
var letters = Set<String>()
// ๊ฐ’ ๋„ฃ๊ธฐ
letters.insert("Classical Music")

// ์ดˆ๊ธฐํ™”
letters = []

var favoriteGenres: Set<String> = ["Rock", "Classical", "Hip hop"]

favoriteGenres.isEmpty // false
favoriteGenres.count // 3
favoriteGenres.contains("Rock") // true
favoriteGenres.randomElement() // Hip hop (๋‹ค๋ฅธ element๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์Œ)

// ์—…๋ฐ์ดํŠธ(update) - ์‚ฝ์ž…, ๊ต์ฒด, ์ถ”๊ฐ€
// ๋ฐฐ์—ด์—์„œ ์‚ฌ์šฉํ•˜๋Š” append๊ฐ€ ์—†์Œ
var set1: Set<Int> = [1,1,2,2,3,3]     // ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ
set1.update(with: 1) // 1 -> ๊ธฐ์กด์— ์žˆ๋˜ ์š”์†Œ์ด๋ฏ€๋กœ ๊ฐ’์„ ์˜ต์…”๋„ ํƒ€์ž…์œผ๋กœ ๋ฆฌํ„ด
set1.update(with: 7) // nil -> ๊ธฐ์กด์— ์—†๋˜ ์š”์†Œ์ด๋ฏ€๋กœ Set์— ์š”์†Œ๊ฐ€ ์ถ”๊ฐ€๋˜๊ณ  nil ๋ฆฌํ„ด

set1.remove(1) // 1 -> ์‚ญ์ œ๋œ ์š”์†Œ๋ฅผ ๋ฆฌํ„ด
set1 // [2,3,7]

set1.remove(5) // nil -> ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์š”์†Œ๋ฅผ ์‚ญ์ œํ–ˆ์„ ๋•Œ ์—๋Ÿฌ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ  nil ๋ฆฌํ„ด

// ์ „์ฒด์š”์†Œ ์‚ญ์ œ
set1.removeAll()
set1.removeAll(keepingCapacity: true) // ์š”์†Œ๋Š” ์ œ๊ฑฐํ•˜์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ œ๊ฑฐํ•˜์ง€ ์•Š๋Š”๋‹ค

 

 

๋”•์…”๋„ˆ๋ฆฌ (Dictionary)

 

  • Dictionary๋Š” ์‚ฌ์ „์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.
  • Dictionary๋Š” ์ˆœ์„œ๋ฅผ ์ •์˜ํ•˜์ง€ ์•Š๊ณ  ๊ฐ™์€ ํƒ€์ž…์˜ key์™€ ๊ฐ™์€ ํƒ€์ž…์˜ value๋ฅผ ์ €์žฅ
    • key๋Š” ์ค‘๋ณต๋  ์ˆ˜ ์—†๋‹ค.
    • ๋ชจ๋“  key๋Š” ๊ฐ™์€ ํƒ€์ž…์ด์–ด์•ผ ํ•œ๋‹ค.
    • ๋ชจ๋“  value๋Š” ๊ฐ™์€ ํƒ€์ž…์ด์–ด์•ผ ํ•œ๋‹ค.
    • key์™€ value๋Š” ๋‹ค๋ฅธ ํƒ€์ž…์ด์–ด๋„ ๋œ๋‹ค.
  • ์‹ค๋ฌผ ์‚ฌ์ „์„ ์ฐพ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ˆœ์„œ๊ฐ€ ์•„๋‹Œ ์‹๋ณ„์ž ๊ธฐ์ค€์œผ๋กœ ๊ฐ’์„ ์ฐพ์„ ๋•Œ Dictionary๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
var namesOfIntegers: [Int: String] = [:]

namesOfIntegers[16] = "sixteen" // 16์€ subscript๊ฐ€ ์•„๋‹ˆ๋ผ "ํ‚ค"์ž„

// ์ดˆ๊ธฐํ™”
namesOfIntegers = [:]

var airports: [String: String] = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]

airports.keys // ["YYZ", "DUB"]
airports.values // ["Toronto Pearson", "Dublin"]

airports.keys.sorted() // ["DUB", "YYZ"]
airports.values.sorted() // ["Dublin", "Toronto Pearson"]

airports["APL"] = "Apple International"
// airports = ["YYZ": "Toronto Pearson", "DUB": "Dublin", "APL": "Apple International"]

// key์— ๋งค์นญ๋œ value ๊ฐ’ ์ดˆ๊ธฐํ™”
airports["APL"] = nil

// ๋”•์…”๋„ˆ๋ฆฌ airports์— ์žˆ๋Š” ๊ฐ’์˜ ์ˆ˜
print(airports.count)
// ์ถœ๋ ฅ๊ฐ’: 2

// ๋”•์…”๋„ˆ๋ฆฌ airports์— ์žˆ๋Š” ๋ชจ๋“  key๋“ค
print(airports.keys)
// ["YYZ", "DUB"]

// ํ•ด๋‹น key๊ฐ€ ์žˆ๋‹ค๋ฉด value๋ฅผ ๋ฎ์–ด์“ฐ๊ณ , ๋ฎ์–ด์“ฐ๊ธฐ ์ „ ๊ธฐ์กด๊ฐ’์šธ ๋ฐ˜ํ™˜
let newYyz = airports.updateValue("Hello YYZ", forKey: "YYZ") 
           
print(newYyz) // ์ถœ๋ ฅ๊ฐ’: Optional("Toronto Pearson")
print(airports["YYZ"]) // ์ถœ๋ ฅ๊ฐ’: Optional("Hello YYZ")

// ํ•ด๋‹น key๊ฐ€ ์—†๋‹ค๋ฉด ๊ทธ key์— ํ•ด๋‹นํ•˜๋Š” value์— ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๊ณ  nil์„ ๋ฐ˜ํ™˜
let newApl = airports.updateValue("Hello APL", forKey: "APL") 

print(newApl) // ์ถœ๋ ฅ๊ฐ’: nil
print(airports["APL"]) // ์ถœ๋ ฅ๊ฐ’: Optional("Hello APL")