집단 자료형(튜플, 딕셔너리)💻

DEVJUN·2022년 4월 29일
1

Swift 문법

목록 보기
4/14
post-thumbnail

1. 튜플

  튜플(Tuple)은 스위프트에서 제공하는 특별한 성격의 집단 자료형으로, 파이썬에도 튜플 자료형이 있다. 튜플은 한 가지 타입의 아이템만 저장할 수 있는 배열이나 딕셔너리와 달리 하나의 튜플에 여러 가지 타입의 아이템을 저장할 수 있지만, 일단 선언되고 나면 상수적 성격을 띠므로 더 이상 값을 추가하거나 삭제하는 등의 변경이 불가능하다 그래서 선언된 후로 동적 추가 또한 불가능하다.

	let tupleValue("a", "b", 1, 2.4, true)

	//튜플 참조
	tupleValue.0 // "a"
	tupleValue.3 // 2.4
    
    //타입 어노테이션을 이용한 튜플 선언
    
    let tupleValue: (String, Character, Int) = ("a", "b", 3)
    
    //튜플의 아이템을 개별 변수나 상수로 각각 할당받는 바인딩 방식
    let(a, b, c) = tupleValue
    // a -> "a"
    // b -> "b"
    // c -> 3
    
    print(a) // "a"
    print(c + 1) // 4
    
    

  튜플은 배열이나 딕셔너리처럼 선언할 수 있는 키워드가 없고 튜플로 정의된 변수라 해도 제공하는 메소드가 없다...
튜플의 크기를 계산할 수 있는 속성, 데이터를 읽어올 수 있는 메소드, 튜플을 순회할 수 있는 순회 특성도 지원하지 않아 for ~ in 구문도 사용할 수 없다.

  그러나 튜플도 장점이 있다. 함수나 메소드에서 둘 이상의 값을 반환하려는 별도의 자료형 객체를 만들거나 배열 또는 딕셔너리를 만들어 담아야 하는데, 이때 튜플을 이용하면 바로 전달할 수 있어 무척 편리하다.

	//결과값으로 튜플을 반환하는 함수
    func getTupleValue() -> (String, String, Int) {
    	return ("t", "v", 100)
    }
    
    //함수가 반환하는 튜플을 튜플 상수로 바인딩
    let (a, b, c) = getTupleValue()
    // a -> "t"
    // b -> "v"
    // c -> 100
    

  위 코드에서 a에는 "t", b에는 "v", c에는 100이 할당된다.

튜플을 사용하면 반환할 데이터들을 단순히 괄호로 묶는 것만으로 자료형이 만들어지므로 코드가 매우 단순해진다는 이점이 생긴다. 따라서 아이템을 추가, 수정, 삭제할 수 없다는 제약에도 불구하고 활용된다.

2. 딕셔너리

  딕셔너리는 마치 사전에서 고유 단어와 그 의미가 연결되어 있는 것처럼, 고유 키(key)와 그에 대응하는 값(value)을 연결하여 데이터를 저장하는 자료형이다. 인덱스 대신 고유 키를 사용한다는 차이를 제외하면 배열과 흡사한 자료형이다.

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

  • 하나의 키는 하나의 데이터에만 연결되어야 한다.

  • 하나의 딕셔너리에서 키는 중복될 수 없다. 중복해서 선언하면 아이템 추가가 아니라 수정이 이루어져 기존 키에 연결된 데이터가 제거된다.

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

  • 딕셔너리 아이템에는 순서가 없지만 키에는 내부적으로 순서가 있으므로 for ~ in 구문을 이용한 순회 탐색을 할 수 있다.

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

  딕셔너리에서 키로 사용할 수 있는 타입은 다양하다. 문자열은 물론 단일 문자(Character)도 키로 사용할 수 있고 심지어 정수나 실수도 키로 사용할 수 있다. 클래스의 인스턴스도 키로 사용할 수 있다. 그러나 데이터 타입이 해시(Hash) 값을 추출할 수 있는 기능이 포함되어 있어야 한다.

	var capital = ["KR": "Seoul", "EN": "London", "FR": "Paris"] //딕셔너리의 정적선언 및 값 할당
    // key: value
    // "KR" : "Seoul"
    // "EN" : "London"
    // "FR" : "Paris"
	
    capital["KR"] // "Seoul" //값 참조
    capital["FR"] // "Paris"

  또한 딕셔너리는 순서를 갖지 않는다.

    1. 딕셔너리 선언 및 초기화

	딕셔너리 선언과 초기화
    
	// 방법 1
	var capital = Dictionary<String, String>()
    
    //방법 2
    var capital = [String: String]()
    
    //타입 어노테이션을 이용한 딕셔너리 선언
    var capital : Dictionary<String, String>
    //딕셔너리 초기화
    capital = Dictionary()
    
    
    //타입 어노테이션을 이용한 딕셔너리의 선언
    var capital : [String : String]
    //딕셔너리 초기화
    capital = [String : String]()
    
    
    
    딕셔너리에 동적으로 아이템 추가
    
    var capital = [String : String]()
    newCapital["JP"] = "Tokyo"
    
    if capital.isEmpty {
    	print("딕셔너리가 비어 있음")
    } else {
    	print("딕셔너리의 크기는 \(capital.count)") 
    }
    
    //메소드로 동적으로 값 할당하기
    //updateValue(_:forKey) 메소드 : 새로운 키가 입력되면 아이템을 추가하고 기존에 있는 키가 입력되면 딕셔너리에 저장된 값을 수정하고, 이전의 값이 결과값으로 반환됨
    
    capital.updateValue("Seoul", forKey: "KR") //"KR" : "Seoul" 데이터가 추가되고 nil을 리턴 
	// capita: ["JP" : "TOKYO", "KR" : "Seoul"]
    
	capital.updateValue("London", forKey: "EN") //"EN" : "London" 데이터가 추가되고 nil을 리턴 
    // capita: ["JP" : "TOKYO", "KR" : "Seoul", "EN" : "London"]
    
    capital.updateValue("Osaka", forKey: "JP") //"JP" : "Osaka" 데이터가 수정되고 "Tokyo"를 리턴 
    // capita: ["JP" : "Osaka", "KR" : "Seoul", "EN" : "London"]
    
    
    
	딕셔너리 삭제 
    1. nil(값이 없음)을 통해서 삭제
    2. removeValue(forKey: "CA") 메소드를 통한 삭제
    
    
    capital["KR"] = nil // capita: ["JP" : "Osaka", "EN" : "London"]
    capital.removeValue(forKey: "JP") // capita: [ "EN" : "London"]
    
    
    딕셔너리 순회 탐색
    
    var capital = ["KR": "Seoul", "EN": "London", "FR": "Paris"] //딕셔너리의 정적선언 및 값 할당
    
    //방법1. row로 대입
    for row in capital {
    	let (key, value) = row
        print("현재 데이터는 \(key) : \(value)")
    }
    
    //현재 데이터는 "KR" : "Seoul"
    //   ''      "EN" : "London"
    //   ''      "FR" : "Paris"
    
    
    //방법2. 
    for (key, value) in capital {
    	print("현재 데이터는 \(key) : \(value)")
    }
    
    

  위 예제 코드에서는 모든 주석으로 보여지는 예제에 대한 출력이 순서대로 되어있지만 실제로는 순서대로 탐색되지 않는다. 기본적으로 딕셔너리는 고유 키에 대한 해시 처리 값을 기준으로 내부 정렬하기 때문에 데이터가 우리의 생각과는 다르게 순서대로 출력되지 않는 다는 점을 알아야한다.

profile
🧑🏻‍💻iOS

0개의 댓글