본문 바로가기
Swift랑 친해지기/Swift 책보면서 정리해보기

[집단 자료형] 딕셔너리 (Swift)

by 데브킹덕 2022. 1. 28.

딕셔너리란?? (Dictionary)

사전에서 고유 단어와 그 의미가 연결되어 있는 것처럼. 

고유 키(Key)와 그에 대응하는 값 (Value)을 연결하여 데이터를 저장하는 자료형

 

 

딕셔너리 정의

[ 키 : 데이터, 키 : 데이터, ... ]

대괄호 사용하고 내부에 차례로 데이터를 작성하면 됨

먼저 데이터를 참조하기 위한 키를 작성하고 이어서 여기에 연결될 값을 작성하는 방식 

이때 키와 값 사이는 콜론(:)으로 구분함 

 

딕셔너리는 불특정 키가 사용되므로 데이터를 입력할 때 반드시 키와 함께 쌍으로 입력해야 함

 

⚠️주의할 점⚠️

여기 있는 내용은 필수적으로 지켜야 됨

 

1. 하나의 키는 하나의 데이터에만 연결되어야 함

 

2. 하나의 딕셔너리에  키가 중복 될 수 없음

    만약 중복해서 선언하면 아이템 추가가 아니라 수정이 이루어져 기존 키에 연결된 데이터가 제거됨 

 

3. 저장할 수 있는 데이터 타입에는 제한이 없지만, 하나의 딕셔너리에 저장하는 데이터 타입은 모두 일치해야함

 

4. 딕셔너리의 아이템에는 순서가 없지만 키에는 내부적으로 순서가 있음

    때문에 for ~ in 구문을 이용한 순회탐색을 할 수 있음

 

5. 딕셔너리에서 사용할 수 있는 키의 타입은 거의 제한이 없으나 해시(Hash)연산이 가능한 타입이어야 함 

    즉 데이터 타입에 해시 값을 추출할 수 있는 기능이 포함되어야 함 

 

6. 딕셔너리가 아이템을 저장할 때는 입력된 키를 그대로 사용하는 것이 아니라 내부적으로 해시 연산을 거친 값으로 변환한 다음 이를 

     정렬하여 사용함. 이는 데이터의 빠른 검색을 위한 장치이지만, 이 때문에 딕셔너리에 사용할 수 있는 키타입은 해시 연산을 할 수 있는  

     타입으로 제한됨 

 

7. 스위프트에서 해시 연산을 위해서는 Hashable 프로토콜이 구현되어야 하는데 

    문자열 타입은 Hashable 프로토콜이 이미 구현되어 있으므로 대부분의 딕셔너리는 문자열을 키로 사용함

    숫자를 사용할거면 딕셔너리 대신 보통 배열을 사용함 

 

국가 코드를 키로 하여 수도 이름을 저장하는 딕셔너리

 

- 국가별 코드를 문자열 타입의 키로 사용

- 수도 이름을 문자열 타입의 데이터로 사용하는 딕셔너리를 정의하고, 

   이를 capital 변수에 할당했음

- 이 딕셔너리는 현재 "KR", "EN", FR" 모두 3개의 아이템이 각각의 키로 연결된 상태임

 

딕셔너리의 아이템 참조 방법

-> 딕셔너리가 할당된 변수나 상수 다음에 대괄호를 붙이고,

괄호 내부에 참조 할 아이템에 해당하는 키 객체를 넣으면 됨 

 

우리가 대부분 딕셔너리를 사용할 떄는 모든 데이터를 입력한 상태로 사용하는 경우보다는 

빈 딕셔너리를 선언하고 초기화한 다음 필요한 시기에 아이템을 추가하는 방식을 사용함

 

빈 딕셔너리 선언,초기화 하는 구문 형식

Dictionary<키의 타입, 값의 타입>()

- 딕셔너리 선언할 때에는 Dictionary 구조체가 사용됨.

- 객체를 사용하여 선언할 때 <> 사이에 키로 사용할 타입과 값으로 사용할 타입을 지정해야 함 (Generic, 제네릭)

  * 제네릭 - 자료형 뒤에 <> 기호가 붙고 그사이에 데이터 타입을 명시해주는 구문을 뜻함 

- 딕셔너리의 제네릭은 키로 사용할 타입을 앞에, 값으로 사용할 타입을 뒤에 작성

- 구문의 마지막 부분에 초기화를 위한 연산자 ()가 있어야만 선언된 딕셔너리가 메모리에서 데이터를 저장할 공간을 할당 받을 수 있음 

 

예시)

문자열 키와 정수 값으로 이루어진 딕셔너리

Dictionary<String, Int>()

문자열 키와 범용 클래스 값으로 이루어진 딕셔너리

Dictionary<String, AnyObject>()

 

딕셔너리의 간결한 선언과 초기화 구문

[ 키로 사용할 타입 : 값으로 사용할 타입 ]()

예시)

문자열 키와 정수 값으로 이루어진 딕셔너리

[String : Int]()

문자열 키와 범용 클래스 값으로 이루어진 딕셔너리

[String : AnyObject]()

딕셔너리의 선언과 초기화 정리

//딕셔너리의 선언함과 동시에 타입을 정의하는 법 
//방법 1
var capital = Dictionary<String,String>()

//방법 2
var capital = [String : String]()


// 타입 어노테이션을 사용하여 선언과 초기화를 분리하면??
// 방법 1
//타입 어노테이션을 이용한 딕셔너리 선언
var capital : Dictionary<String, String>

//딕셔너리의 초기화
capital = Dictionary()

// 방법2
// 타입 어노테이션을 이용한 딕셔너리의 선언
var capital :[String : String]
//딕셔너리의 초기화
capital = [String:String]()


// 이 외에도 딕셔너리의 초기화 하는 방법이 다양함 
var capital : [String : String]

//딕셔너리의 초기화 
capital = Dictionary<String,String>()  //----- 1번

capital = Dictionary() //---- 2번

capital = [String:Sting] //---- 3번

capital = [:]   //---- 4번

딕셔너리의 초기화 중 2번과 4번을 사용할 때 주의할 점이 있음

뭐나면 타입 지정이 생략되어 있다는 거임

이거는 애초에 타입 어노테이션을 통해 딕셔너리의 타입이 명시적으로 선언되어 있기 때문에 사용할 수 있는거임 

 

다음시간에 딕셔너리에 동적으로 아이템 추가하는 방법에 대해 알아보자..