안녕하세요!
이번 포스팅에서는 Swift에서 사용하는 딕셔너리에 대해서 한 번 정리해보려고 합니다.
먼저 딕셔너리의 개념 먼저 정리하고 가보겠습니다.
Dictionary 개념
Swift에서 딕셔너리는 키와 그에 대응하는 값들의 집합을 저장하고 관리하는데 사용되는 데이터 타입입니다. 딕셔너리는 다른 언어에서 'Map'이나 'Hash'와 유사하다고 생각하시면 됩니다!
딕셔너리는 사전이라는 뜻을 가지고 있는데 이 딕셔너리도 사전이랑 구조가 비슷하다고 생각하시고 글을 보시면 이해하기 쉬울 것 같습니다!!
Dictionaty 특징
자 개념을 살펴봤으니 이제 특징에 대해서 간단히 정리해보겠습니다.
사전은 단어와 뜻이 짝 지어서 이루어져 있습니다. 딕셔너리도 똑같습니다.
딕셔너리는 Key와 Value 이렇게 2가지로 이루어져 있는데 이 Key와 Value를 하나의 요소로 짝 지어서 저장합니다.
Key : 하나의 딕셔너리 안에서 유일한 값
Value : 다른 Key의 Value와 같아도 상관 없다.
그리고 딕셔너리에 저장되는 요소는 정렬되지 않습니다.
딕셔너리에도 인덱스가 있고 정렬 메소드가 있습니다. 그래서 딕셔너리도 정렬이 되겠지? 라고 오해하는 경우가 많은데
딕셔너리를 print 해보면 삽입 순서와 상관 없이 랜덤으로 나오는 것을 볼 수 있습니다.
Dictionary 사용법
자 개념과 특징을 알아봤으니 이제 딕셔너리를 사용하는 방법을 정리해보겠습니다!
Dictionary 생성법
먼저 딕셔너리 생성하는 방법입니다. Swift에서 딕셔너리를 생성하는 방법은 여러가지가 있습니다. 가장 기본적인 방법부터 살펴보겠습니다.
1. 빈 딕셔너리 생성: 아래의 코드는 키와 값의 타입을 명시적으로 선언하여 빈 딕셔너리를 만드는 방법입니다.
var dict1: [String: Int] = [:]
2. 초기값을 가진 딕셔너리 생성: 아래의 코드는 키와 값의 쌍을 가진 딕셔너리를 생성하는 방법입니다.
var dict2: [String: Int] = ["apple": 5, "banana": 3]
3. 딕셔너리 리터럴을 이용한 생성: 아래의 코드는 딕셔너리 리터럴을 이용하여 딕셔너리를 생성하는 방법입니다.
var dict3 = ["apple": 5, "banana": 3]
4. 딕셔너리 생성자를 이용한 생성: 아래의 코드는 딕셔너리 생성자를 이용하여 딕셔너리를 생성하는 방법입니다.
let keys = ["apple", "banana"]
let values = [5, 3]
let dict4 = Dictionary(uniqueKeysWithValues: zip(keys, values))
각 방법별로 간단히 장단점을 정리해보자면
우선 1번 방법은 아직 값이 없거나 추후에 값을 추가할 때 유용하다는 장점이 있지만 생성 시점에서는 아무런 값이 없기 때문에 초기에 사용할 수 있는 데이터가 없다는 단점이 있습니다. 어찌보면 당연한 단점이죠?
2번 방법은 딕셔너리를 생성하는 시점에 특정 값을 가진 딕셔너리를 생성할 수 있어 초기 데이터를 활용할 수 있다는 장점이 있습니다. 하지만 초기 데이터가 필요 없는 경우나 값이 계속 변경되는 경우에는 이 방법이 비효율적일 수 있습니다.
3번 방법은 코딩 시 빠르고 간편하게 딕셔너리를 생성할 수 있습니다. 하지만 타입 추론이 필요한 경우, 컴파일러에게 추가적인 부담을 줄 수 있습니다.
4번 방법은 키 배열과 값 배열이 이미 있을 때, 이들을 조합하여 딕셔너리를 생성할 수 있다는 장점이 있습니다. 하지만 키와 값의 순서가 일치해야 하며, 두 배열의 길이도 같아야 합니다. 그렇지 않으면 실행 시 오류가 발생할 수 있습니다.
딕셔너리 생성 방법은 주어진 상황별로 달라질 수 있으니 이런 장단점을 고려해서 본인에게 가장 적합한 방법을 적용하면 좋을 것 같습니다!
Dictionary 값 추가 방법
딕셔너리에 새로운 값을 추가하려면 dict 키워드 뒤에 ["추가하고 싶은 키"]을 넣어주고 = 뒤에 값을 넣어주면 됩니다.
dict["orange"] = 7
이런 식으로요!
Dictionary 값 변경 방법
딕셔너리를 사용하다보면 기존 값을 변경하고 싶은 순간이 있는데 그럴 땐 간단하게 기존 딕셔너리에서 값만 바꿔주면 됩니다.
dict["apple"] = 6
이렇게 말이죠!
Dictionary 값 가져오기
딕셔너리의 값을 가져오려면
if let appleCount = dict["apple"] {
print("사과의 수량은 \(appleCount)개입니다.")
}
이렇게 코드를 작성해주면 됩니다!
Dictionary 값 삭제
내가 지우고 싶은 딕셔너리의 값이 있다면 = 뒤에 nil을 사용해주면 됩니다.
dict["banana"] = nil
만약 딕셔너리의 모든 값을 지우고 싶다면
dict.removeAll()
이렇게 작성해주면 되고요!
Dictionary 반복문
딕셔너리에서 반복문을 사용할 수도 있습니다. 만약 딕셔너리의 모든 요소를 순회하려면 for-in문을 사용할 수 있습니다.
for (key, value) in dict {
print("\(key): \(value)")
}
Dictionary의 키와 값들을 배열로 가져오기
딕셔너리의 키와 값들을 각각 배열로 가져오는 것도 가능합니다.
Swift에서 딕셔너리의 키와 값을 가져오는 방법은 keys와 values의 속성을 사용하는 것인데
keys 속성은 딕셔너리의 모든 키를 컬렉션으로 반환하며, values 속성은 딕셔너리의 모든 값을 컬렉션으로 반환합니다.
이렇게 반환된 컬렉션을 배열로 변환하려면, 아래와 같이 코드를 작성하면 됩니다.
let keys = [String](dict.keys)
let values = [Int](dict.values)
이렇게 하면 dict.keys는 딕셔너리의 모든 키를, dict.values는 딕셔너리의 모든 값을 반환합니다.
[String](dict.keys)와 [Int](dict.values)는 각각 키의 컬렉션과 값의 컬렉션을 String 타입과 Int 타입의 배열로 변환합니다.
따라서 keys는 딕셔너리의 모든 키를 포함하는 String 배열이 되고, values는 딕셔너리의 모든 값을 포함하는 Int 배열이 됩니다. 이렇게 하면 딕셔너리의 키와 값을 배열 형태로 다룰 수 있게 됩니다.
Dictionary 특정 요소 검색하기
딕셔너리에서 특정 요소를 검색하는 방법은 주로 2가지가 있습니다.
1. 키를 이용한 검색: 딕셔너리의 키를 이용해 값을 찾는 가장 기본적인 방법입니다.
var fruits = ["apple": 5, "banana": 3, "orange": 7]
if let appleCount = fruits["apple"] {
print("사과의 수량은 \(appleCount)개입니다.")
} else {
print("사과가 딕셔너리에 없습니다.")
}
위 코드에서 "apple"이라는 키를 이용하여 사과의 수량을 찾았습니다. 만약 찾는 키가 딕셔너리에 없다면 nil을 반환하므로, 옵셔널 바인딩을 사용하여 nil 체크를 합니다.
2. first(where:) 메서드를 이용한 검색: first(where:) 메서드를 이용하면 조건에 맞는 첫 번째 요소를 검색할 수 있습니다.
var fruits = ["apple": 5, "banana": 3, "orange": 7]
if let foundItem = fruits.first(where: { $0.value == 3 }) {
print("수량이 3인 과일은 \(foundItem.key)입니다.")
} else {
print("수량이 3인 과일이 딕셔너리에 없습니다.")
}
위 코드에서 first(where:) 메서드를 이용하여 수량이 3인 첫 번째 과일을 찾았습니다. 만약 조건에 맞는 요소가 없다면 nil을 반환하므로, 옵셔널 바인딩을 사용하여 nil 체크를 합니다.
*여기서 중요한 부분이 있습니다!!*
Swift의 딕셔너리에서 first(where:)나 filter(_:) 같은 메서드를 사용하여 요소를 검색할 때, 클로저를 사용하게 됩니다. 이 클로저는 딕셔너리의 각 요소를 입력으로 받아, 조건에 따라 Bool 값을 반환합니다.
딕셔너리의 각 요소는 (키, 값) 형태의 튜플로 이루어져 있습니다. 따라서 [String: String] 타입의 딕셔너리에서 first(where:)를 사용할 때의 클로저는 ((String, String)) -> Bool 형태가 됩니다.
즉, 클로저의 파라미터 타입은 우리가 지정한 딕셔너리의 타입을 갖는 튜플이어야 하고 반환타입은 Bool이어야 합니다.
아래의 예제를 보시면 이해가 더 쉬울 것입니다.
let dict = ["apple": "red", "banana": "yellow", "grape": "purple"]
if let foundItem = dict.first(where: { (key, value) -> Bool in
return value == "red"
}) {
print("빨간색 과일은 \(foundItem.key)입니다.")
} else {
print("빨간색 과일이 딕셔너리에 없습니다.")
}
위 코드에서 filter(_:) 메서드의 클로저는 (key, value) -> Bool 형태입니다.
이 클로저는 "value == 'red' || value == 'green'"라는 조건을 검사하여, 그 결과를 Bool 값으로 반환합니다. 반환된 Bool 값이 true인 요소만을 모아 새로운 딕셔너리를 생성합니다.
따라서 실행 결과는 ["apple": "red", "kiwi": "green"]가 됩니다. 이런 식으로 filter(_:) 메서드를 이용하면 조건에 맞는 요소만을 필터링하여 새로운 딕셔너리를 만들 수 있습니다.
이번 포스팅에서는 Dictionary에 대해서 정리를 해봤는데 공부를 하다가 추가적으로 알게 되는 부분이 있다면 또 포스팅을 하도록 하겠습니다!
감사합니다!
잘못된 내용이 있거나 더 좋은 내용 피드백은 언제나 환영합니다!
궁금하신 부분은 댓글로 질문 부탁드립니다!
'Apple > Swift' 카테고리의 다른 글
[Swift] Generic 이해하기 (0) | 2024.01.04 |
---|---|
[Swift] 예외처리 - 만약 에러가 발생한다면?? (2) | 2024.01.03 |
[Swift] Self 프로퍼티 (2) | 2023.10.30 |
[Swift] 객체 인스턴스(object instance) (0) | 2023.10.20 |
[Swift] 저장 프로퍼티와 지연 저장 프로퍼티(Stored Properties, Lazy Stored Properties) (2) | 2023.10.19 |