반응형
LinkedIn 개발자로 성장하면서 남긴 발자취들을 확인하실 수 있습니다.
Github WWDC Student Challenge 및 Cherish, Tiramisul 등 개발한 앱들의 코드를 확인하실 수 있습니다.
개인 앱 : Cherish 내 마음을 들여다보는 시간, 체리시는 디자이너와 PM과 함께 진행 중인 1인 개발 프로젝트입니다.
10년 후, 20년 후 나는 어떤 스토리 텔러가 되어 있을지 궁금하다. 내가 만약에 아직 조금 더 탐구하고 싶은 게 있고, 궁금한 게 있다면, 그게 설사 지금 당장의 내 인생에 도움이 안 되는 것 같더라도 경험해보자. 그 경험들을 온전히 즐기며 내 것으로 만들고, 내 일에 녹여내고... 그러다보면 그 점들이 모여 나란 사람을 그려내는 선이 될 테니까.

Recent Posts
Recent Comments
Total
관리 메뉴

꿈꾸는리버리

Swift) Dictionary 초기화 방법 본문

오뚝이 개발자/swift

Swift) Dictionary 초기화 방법

rriver2 2023. 5. 12. 09:30
반응형

프로그래머스 문제를 풀다가 정리하게 된 내용으로, Dictionary를 초기화 하는 여러 방법에 대해 공부한 내용이다.


🌟 기초적으로 알고 있는 Dictionary init 방법 

기본적으로는 아래와 같이 많이 사용했었다. 

// 빈 딕셔너리 생성 후 값 넣기
var emptyDict = Dictionary<String, Int>()
var emptyDict = [KeyType: ValueType]()

emptyDict[key값] = value값
// 값을 넣으면서 이전 값 추출하기
let oldValue = dict.updateValue(value3, forKey: key3)


// 딕셔너리 만들면서 초기화 시키기
let dict = ["key1": value1, "key2": value2, "key3": value3]

 

🌟 Dictionary init 

아래와 같이 Dictionary를 초기화 하는 방법엔 여러가지가 있다.

 1️⃣ init(minimumCapacity:) 

생성 후 디셔너리에 추가할 키-값 쌍의 용량을 알고 있을 때 사전의 저장 버퍼의 중간 재할당을 피하기 위해 이 이니셜라이저를 사용할 수 있다.  아래의 코드를 보면 딕셔너리에 3개의 값을 넣었음에도 dictionary의 용량이 10인 것을 알 수 있다.

var dict = Dictionary<String, Int>(minimumCapacity: 10)

// 딕셔너리에 몇 개의 키-값 쌍 추가
dict["one"] = 1
dict["two"] = 2
dict["three"] = 3

// 딕셔너리의 요소 수와 용량 확인
print("Dictionary count: \(dict.count)") // 출력: Dictionary count: 3
print("Dictionary capacity: \(dict.capacity)") // 출력: Dictionary capacity: 10

💬 10개의 요소 이상으로는 저장이 안되는 걸까? 

하지만 아래와 같이 10으로 용량을 설정했다고 해서 10개 이상의 딕셔너리 값을 저장하는 것은 아니다. 딕셔너리에 새로운 요소가 추가될 때마다, Swift는 자동으로 용량을 늘리거나 줄여서 딕셔너리 내부에서 키-값 쌍을 저장할 공간을 효율적으로 관리한다. 

 

💬 그럼 언제 쓰는 거지..??

 init(minimumCapacity:) 이니셜라이저를 활용하면 딕셔너리가 요소를 추가하거나 삭제할 때 메모리를 동적으로 할당하는 비용을 줄이고, 성능을 향상시킬 수 있다. 따라서 딕셔너리에 대부분의 요소를 미리 알고 있거나, 요소를 추가하거나 제거하는 빈도가 낮은 경우에는 init(minimumCapacity:) 이니셜라이저를 사용하여 초기 용량을 지정하는 것이 유용하다.

 

 2️⃣ init(uniqueKeysWithValues:) 

array1과 array2를 1:1 mapping을 해서 dictionary로 만들때 Dictionary(uniqueKeysWithValues: zip( 튜플 )) 을 쓸 수 있다.

이는 내가 프로그래머스 문제를 풀었을 때 활용할 수 있었던 init이었다.

let digitWords = ["one", "two", "three", "four", "five"]
let indexs = Array(1...5)
let wordToValue = Dictionary(uniqueKeysWithValues: zip(digitWords, indexs))
// let wordToValue = Dictionary(uniqueKeysWithValues: zip(digitWords, 1...5))

print(wordToValue) //  "["three": 3, "four": 4, "five": 5, "one": 1, "two": 2]"

 

 3️⃣ init(_:uniquingKeysWith:) 

이 init은 좀 재밌었다.

기존의 배열에서 중복된 키-값 튜플이 있을 때 이 init을 사용해서 어떤 이니셜라이저를 사용할지 선택할 수 있다. Dictionary가 만들어지면서, init은 중복 키에 대한 현재 및 새 값으로 결합 클로저를 호출한다. 이 클로져를 적절히 사용하면, 이전에 있던 값 혹은 이번에 추가하려는 값 두 값 중에서 선택하거나, 결합하여 새로운 값을 생성하거나, 오류도 던질 수 있다.

다음 예제는 중복 키 중 젤 처음 추가되었던 key와 value 쌍을 남겨두는 예제와, 들어오는 value의 값을 누적해서 더해가는 예제이다.

let pairsWithDuplicateKeys = [("a", 1), ("b", 2), ("a", 3), ("b", 4)]

let firstValues = Dictionary(pairsWithDuplicateKeys,
                             uniquingKeysWith: { (first, _) in first })
// ["b": 2, "a": 1]

let mergeValues = Dictionary(pairsWithDuplicateKeys,
                             uniquingKeysWith: { $0 + $1 })
// ["b": 6, "a": 4]

 

 4️⃣ init(grouping:by:) 

이번에는 ["Kofi", "Abena", "Efua", "Kweku", "Akosua"]와 같은 배열에서, 배열의 첫번째 글자가 "K"인 요소들끼리 묶어서 key가 "K", value가 "K로 시작하는 이름의 배열"로 만드는 init 방식이다.

let students = ["Kofi", "Abena", "Efua", "Kweku", "Akosua"]
let studentsByLetter = Dictionary(grouping: students, by: { $0.first! })
// ["E": ["Efua"], "K": ["Kofi", "Kweku"], "A": ["Abena", "Akosua"]]

흠.. 어디다 쓰일까 싶어서 고민을 해봤는데, 아래와 같이 배열의 몫으로 묶어주는 것처럼 앞으로 활용도 높게 사용할 수 있을 것 같았다.

let numbers = [1, 2, 3, 4, 5, 6]
let groupedNumbers = Dictionary(grouping: numbers, by: { $0 / 2 })
print(groupedNumbers)
// [0: [1], 1: [2, 3], 2: [4, 5], 3: [6]]

🌟 느낀점 

확실히 많은 수의 문제보다 마음의 여유를 가지고 좀 더 많은 공부를 해봐야지라고 마음을 먹으니까 하나를 하더라도 좀 더 아는 것도 많아지는 것 같다. 천천히 꾸준히 잘 해보자 가은아 화이팅...

반응형
Comments