본문 바로가기
Swfit/Data structure(자료구조)

Dictionary

by GGShin 2022. 9. 28.
A dictionary is a type of hash table, providing fast access to the entries it contains.

Dictionary는 해시 테이블 자료구조 중 하나이며 빠르게 entry에 접근할 수 있다는 특징이 있습니다.

Entry는 key와 value로 이루어져 있고, String 또는 number 형태인 key를 이용해 각 entry의 value를 가져올 수 있습니다. Value는 모든 타입이 다 가능합니다. 

 

다른 중요 특징은 dictionary는 순서를 보장하지 않는다는 점입니다. 그렇기 때문에 dictionary 안의 데이터를 단순히 콘솔창에 찍어보면 매번 내부의 데이터의 순서가 다르게 나온다는 것을 알 수 있습니다. 

 

또 다른 중요 특징으로는 중복된 key를 허용하지 않는다는 점입니다. key를 통해 value에 접근하기 때문에 어찌보면 당연한 일입니다. 

 

1. Key를 (subscript로) 이용해서 value retrieve하기(가져오기)

 

아래처럼 http response 숫자 코드와 메세지를 key, value로 갖는 dictionary가 있습니다.

 

var responseMessages = [200: "OK",
                        403: "Access forbidden",
                        404: "File not found",
                        500: "Internal server error"]

 

Key를 이용해서 value인 http message를 가져오려면 어떻게 하면 될까요?

 

responseMessages[200]
//returns Optional("OK")

 

위와 같이 " [ ] " 안에 key를 명시하면 value를 가져올 수 있습니다. 

다만, 입력한 key의 value가 없는 경우를 대비해 값은 Optional로 반환됩니다. 

 

2. 새로운 key: value pair (entry) 추가/업데이트/삭제하기

 

새로운 entry를 추가 또는 삭제하거나 기존에 들어있던 value를 수정하기 위해서는 아래와 같이 해당 value에 접근하여 값을 추가하거나 수정하면 됩니다. 

뿐만 아니라, nill value를 할당한다는 의미는 해당 entry를 삭제한다는 의미가 됩니다.

//새로운 entry 추가하기
responseMessages[202] = "Created"

//기존의 value 수정하기
responseMessages[404] = "Not found"

//Entry 삭제하기
responseMessages[500] = nil

 

3. Dictionary 내부 contents 순환하기

 

Array 내부 데이터를 순환할 때 for loop을 사용할 수 있는데, Dictionary 역시 마찬가지 입니다. 

 

아래와 같이 key와 value를 각각 가져올 수도 있습니다. 

let imagePaths = ["star": "/glyphs/star.png",
                  "portrait": "/images/content/portrait.jpg",
                  "spacer": "/images/shared/spacer.gif"]

for (name, path) in imagePaths {
    print("The path to '\(name)' is '\(path)'.")
}
// Prints "The path to 'star' is '/glyphs/star.png'."
// Prints "The path to 'portrait' is '/images/content/portrait.jpg'."
// Prints "The path to 'spacer' is '/images/shared/spacer.gif'."

 

만약에 for (name, path) 대신 하나만 입력하면 어떻게 될까요?

다시 말해서 "for a in imagePaths" 와 같이 array를 순환할 때처럼 작성하면 어떻게 될까요?

 

for entry in imagePaths {
    print(entry)
}

/*
Prints 
(key: "spacer", value: "/images/shared/spacer.gif")
(key: "portrait", value: "/images/content/portrait.jpg")
(key: "star", value: "/glyphs/star.png")
*/

 

이렇게 entry를 순환하게 됩니다 ㅎㅎ

 

entry보다는 key 또는 value에만 접근하고 싶다면 어떻게 할 수 있을까요?

for entry in imagePaths {
    print(entry.key)
}

/*
Prints

portrait
star
spacer

*/

entry.key 또는 entry.value로 접근할 수 있겠습니다.

 

여기까지 Swift에서 제공하는 자료구조 중 하나인 Dictionary에 대해 간단히 알아보았습니다. 

앞으로 알게되는 사항이 있으면 추가해나가도록 하겠습니다 :)


 


참고 자료

 

https://mangkyu.tistory.com/102

 

[자료구조] 해시테이블(HashTable)이란?

1. 해시테이블(HashTable)이란? [ HashTable(해시테이블)이란? ] 해시 테이블은 (Key, Value)로 데이터를 저장하는 자료구조 중 하나로 빠르게 데이터를 검색할 수 있는 자료구조이다. 해시 테이블이 빠른

mangkyu.tistory.com

 

https://developer.apple.com/documentation/swift/dictionary

 

반응형