🔥 Dictionary

1170자
13분

Dictionary는 정의된 순서가 없는 컬렉션에서 같은 타입의 키(key)와 같은 타입의 값(value)을 쌍으로 저장하는 자료구조입니다. 각 값은 고유한 키와 연결되어 있어, Dictionary 내에서 해당 값을 식별하는 역할을 합니다. 배열의 항목과는 달리, Dictionary의 항목에는 지정된 순서가 없어요. 실제 사전에서 특정 단어의 정의를 찾는 것과 마찬가지로, Dictionary에서는 식별자를 기반으로 값을 찾을 때 사용합니다.

Dictionary 타입의 축약 구문

Swift에서 Dictionary의 타입은 전체적으로 Dictionary<Key, Value>로 작성되는데, 여기서 Key는 Dictionary 키로 사용할 수 있는 값의 타입이고, Value는 Dictionary가 해당 키에 대해 저장하는 값의 타입입니다.

Dictionary의 타입은 [Key: Value]와 같이 축약형으로도 작성할 수 있어요. 두 형식은 기능적으로 동일하지만, 이 가이드에서는 Dictionary의 타입을 언급할 때 축약형을 사용할 거예요.

빈 Dictionary 만들기

배열과 마찬가지로, 초기화 구문을 사용하여 특정 타입의 빈 Dictionary를 만들 수 있습니다:

var namesOfIntegers: [Int: String] = [:]
// namesOfIntegers는 빈 [Int: String] Dictionary입니다.
swift

위의 예제는 정수 값에 대한 사람이 읽을 수 있는 이름을 저장하기 위해 [Int: String] 타입의 빈 Dictionary를 만듭니다. 키는 Int 타입이고, 값은 String 타입이죠.

만약 컨텍스트에서 이미 타입 정보를 제공한다면, 빈 Dictionary 리터럴([:], 대괄호 안의 콜론)을 사용하여 빈 Dictionary를 만들 수 있습니다:

namesOfIntegers[16] = "sixteen"
// namesOfIntegers에는 이제 1개의 키-값 쌍이 포함되어 있습니다.
namesOfIntegers = [:]
// namesOfIntegers는 다시 한 번 [Int: String] 타입의 빈 Dictionary가 되었습니다.
swift

Dictionary 리터럴을 사용하여 Dictionary 만들기

Dictionary 리터럴을 사용하여 Dictionary를 초기화할 수도 있는데, 이는 앞서 본 배열 리터럴과 유사한 구문을 가지고 있어요. Dictionary 리터럴은 하나 이상의 키-값 쌍을 Dictionary 컬렉션으로 작성하는 간단한 방법입니다.

키-값 쌍은 키와 값의 조합이에요. Dictionary 리터럴에서 각 키-값 쌍의 키와 값은 콜론으로 구분됩니다. 키-값 쌍은 쉼표로 구분되며, 대괄호 한 쌍으로 둘러싸인 목록으로 작성됩니다:

[<#key 1#>: <#value 1#>, <#key 2#>: <#value 2#>, <#key 3#>: <#value 3#>]
swift

아래 예제는 국제 공항의 이름을 저장하기 위한 Dictionary를 만듭니다. 이 Dictionary에서 키는 3글자의 IATA(국제항공운송협회) 코드이고, 값은 공항 이름이에요:

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

airports Dictionary는 [String: String] 타입을 가지도록 선언되었는데, 이는 "키가 String 타입이고 값도 String 타입인 Dictionary"를 의미합니다.

airports Dictionary는 두 개의 키-값 쌍을 포함하는 Dictionary 리터럴로 초기화됩니다. 첫 번째 쌍은 "YYZ"라는 키와 "Toronto Pearson"이라는 값을 가지고, 두 번째 쌍은 "DUB"라는 키와 "Dublin"이라는 값을 가집니다.

이 Dictionary 리터럴은 두 개의 String: String 쌍을 포함하고 있어요. 이 키-값 타입은 airports 변수 선언의 타입(키와 값이 모두 String인 Dictionary)과 일치하므로, Dictionary 리터럴을 사용하여 airports Dictionary를 두 개의 초기 항목으로 초기화하는 것이 허용됩니다.

배열과 마찬가지로, 일관된 타입의 키와 값을 가진 Dictionary 리터럴로 초기화하는 경우에는 Dictionary의 타입을 작성할 필요가 없습니다. airports의 초기화는 다음과 같이 더 짧은 형식으로 작성될 수 있어요:

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

리터럴의 모든 키가 서로 같은 타입이고, 마찬가지로 모든 값이 서로 같은 타입이기 때문에, Swift는 airports Dictionary에 사용할 올바른 타입이 [String: String]임을 추론할 수 있습니다.

Dictionary 접근 및 수정

Dictionary의 메서드와 속성을 통해 또는 첨자 구문을 사용하여 Dictionary에 접근하고 수정할 수 있어요.

배열과 마찬가지로, Dictionary의 항목 수를 읽기 전용 count 속성을 확인하여 알아낼 수 있습니다:

print("The airports dictionary contains \(airports.count) items.")
// "The airports dictionary contains 2 items."를 출력합니다.
swift

count 속성이 0과 같은지 확인하기 위한 지름길로 불리언 isEmpty 속성을 사용할 수 있어요:

if airports.isEmpty {
    print("The airports dictionary is empty.")
} else {
    print("The airports dictionary isn't empty.")
}
// "The airports dictionary isn't empty."를 출력합니다.
swift

첨자 구문을 사용하여 Dictionary에 새 항목을 추가할 수 있습니다. 첨자 인덱스로 적절한 타입의 새 키를 사용하고, 적절한 타입의 새 값을 할당하세요:

airports["LHR"] = "London"
// airports Dictionary에는 이제 3개의 항목이 포함되어 있습니다.
swift

또한 첨자 구문을 사용하여 특정 키와 연결된 값을 변경할 수 있습니다:

airports["LHR"] = "London Heathrow"
// "LHR"에 대한 값이 "London Heathrow"로 변경되었습니다.
swift

첨자를 사용하는 대신, Dictionary의 updateValue(_:forKey:) 메서드를 사용하여 특정 키에 대한 값을 설정하거나 업데이트할 수 있어요. 위의 첨자 예제와 마찬가지로, updateValue(_:forKey:) 메서드는 키가 존재하지 않으면 값을 설정하고, 해당 키가 이미 존재하면 값을 업데이트합니다. 그러나 첨자와 달리 updateValue(_:forKey:) 메서드는 업데이트 후에 이전 값을 반환합니다. 이를 통해 업데이트가 이루어졌는지 여부를 확인할 수 있어요.

updateValue(_:forKey:) 메서드는 Dictionary의 값 타입에 대한 옵셔널 값을 반환합니다. 예를 들어, String 값을 저장하는 Dictionary의 경우 이 메서드는 String? 타입의 값을 반환하는데, 이는 "옵셔널 String"을 의미해요. 업데이트 전에 해당 키에 대한 값이 존재하면 이 옵셔널 값은 업데이트 전의 이전 값을 포함하고, 값이 존재하지 않았다면 nil을 포함합니다:

if let oldValue = airports.updateValue("Dublin Airport", forKey: "DUB") {
    print("The old value for DUB was \(oldValue).")
}
// "The old value for DUB was Dublin."을 출력합니다.
 
swift

또한 첨자 구문을 사용하여 특정 키에 대한 값을 Dictionary에서 검색할 수 있어요. 존재하지 않는 키에 대한 값을 요청할 수 있으므로, Dictionary의 첨자는 Dictionary의 값 타입에 대한 옵셔널 값을 반환합니다. Dictionary가 요청된 키에 대한 값을 포함하고 있다면, 첨자는 해당 키에 대한 기존 값을 포함하는 옵셔널 값을 반환합니다. 그렇지 않으면 첨자는 nil을 반환해요:

if let airportName = airports["DUB"] {
    print("The name of the airport is \(airportName).")
} else {
    print("That airport isn't in the airports dictionary.")
}
// "The name of the airport is Dublin Airport."를 출력합니다.
 
swift

해당 키에 nil 값을 할당하여 첨자 구문을 사용해 Dictionary에서 키-값 쌍을 제거할 수 있습니다:

airports["APL"] = "Apple International"
// "Apple International"은 APL의 실제 공항이 아니므로 삭제합니다.
airports["APL"] = nil
// APL이 이제 Dictionary에서 제거되었습니다.
swift

또는 removeValue(forKey:) 메서드를 사용하여 Dictionary에서 키-값 쌍을 제거할 수 있어요. 이 메서드는 키-값 쌍이 존재하면 제거하고 제거된 값을 반환하며, 값이 존재하지 않으면 nil을 반환합니다:

if let removedValue = airports.removeValue(forKey: "DUB") {
    print("The removed airport's name is \(removedValue).")
} else {
    print("The airports dictionary doesn't contain a value for DUB.")
}
// "The removed airport's name is Dublin Airport."를 출력합니다.
swift

Dictionary 순회

for-in 루프를 사용하여 Dictionary의 키-값 쌍을 순회할 수 있습니다. Dictionary의 각 항목은 (key, value) 튜플로 반환되며, 순회의 일부로 튜플의 멤버를 임시 상수나 변수로 분해할 수 있어요:

for (airportCode, airportName) in airports {
    print("\(airportCode): \(airportName)")
}
// LHR: London Heathrow
// YYZ: Toronto Pearson
swift

for-in 루프에 대한 자세한 내용은 For-In Loops를 참조하세요.

Dictionary의 keysvalues 속성에 접근하여 Dictionary의 키나 값에 대한 반복 가능한 컬렉션을 검색할 수도 있습니다:

for airportCode in airports.keys {
    print("Airport code: \(airportCode)")
}
// Airport code: LHR
// Airport code: YYZ
 
 
for airportName in airports.values {
    print("Airport name: \(airportName)")
}
// Airport name: London Heathrow
// Airport name: Toronto Pearson
swift

Array 인스턴스를 사용하는 API와 Dictionary의 키나 값을 사용해야 하는 경우, keysvalues 속성으로 새 배열을 초기화하면 됩니다:

let airportCodes = [String](airports.keys)
// airportCodes는 ["LHR", "YYZ"]입니다.
 
 
let airportNames = [String](airports.values)
// airportNames는 ["London Heathrow", "Toronto Pearson"]입니다.
swift

Swift의 Dictionary 타입은 정의된 순서가 없어요. 특정 순서로 Dictionary의 키나 값을 순회하려면 keysvalues 속성에 sorted() 메서드를 사용하세요.

이렇게 해서 Swift의 Dictionary 타입에 대해 알아보았습니다. Dictionary는 고유한 키와 연관된 값을 저장하고 검색하는 데 매우 유용한 자료구조입니다. 다음은 Dictionary를 활용하는 몇 가지 예제입니다:

// 학생 이름과 점수를 저장하는 Dictionary
var scores = ["Alice": 85, "Bob": 92, "Charlie": 78]
 
// 새로운 학생 점수 추가
scores["David"] = 88
 
// Bob의 점수 업데이트
scores["Bob"] = 95
 
// Charlie의 점수 삭제
scores["Charlie"] = nil
 
// 모든 학생의 이름과 점수 출력
for (name, score) in scores {
    print("\(name): \(score)")
}
 
swift
// 출력 결과
David: 88
Alice: 85
Bob: 95
text

위 예제에서는 학생 이름을 키로, 점수를 값으로 사용하여 간단한 성적 관리 시스템을 구현했습니다. 이처럼 Dictionary는 키-값 쌍을 효율적으로 관리해야 하는 다양한 상황에서 활용될 수 있습니다.