본문 바로가기
공부/[iOS&Swift]

[Swift] 컬렉션 타입과 열거형에 대해 간략하게 알아보자!

by 인생은아름다워 2022. 1. 11.

🧐 컬렉션타입(Collection type)

컬렉션타입이란 여러개의 데이터를 묶어서 저장하고 관리할 수 있는 자료구조(?)라고 보면 될 것 같다. Swift에서는 배열(Array), 딕셔너리(Dictionary), 세트(Set) 등을 제공한다.

🤔 튜플(tuple)은 컬렉션타입이 아닌가?

Swift에서 튜플은 Collection type 이 아니다! Swift에서 타입은 크게 named type과 compound type이 존재하는데, named type은 우리가 주로 알고있는 기본타입들 외에도 enum, class, struct와 collection type들이 이에 해닿되고 compund type에는 tuple이 해당된다!

  • named types

이름을 가지는 타입(으로생각하자)

그러니까, Swift에서 제공하는 기본자료형(Int, String ...)이외에도 enum, class, struct는 namedType에 속할 수 있다.

(Int, String등의 기본 데이터타입은 struct로 구현되어있기에, 당연히 그럴지도)

  • compound types

복합 타입..? (이름이 없는 타입으로 생각하자)

이 compund typed에는 또 1. function type과 2. tuple type으로 구성된다고 합니다.

그러니까 튜플은 컬렉션타입(named type의 일종)이 아니라는 것!

그럼 마저 컬렉션타입 세 종류에 대해 정리해보자.

  1. Array

같은 타입의 데이터를 일렬로 나열한 후 순서대로 저장하는 형태의 컬렉션타입.

  1. Dictionary

요소들이 순서 없이 키와 값의(key & value) 쌍으로 구성되는 컬렉션 타입.

  1. Set

같은 타입의 데이터를 순서 없이 하나의 묶음으로 저장하는 형태의 컬렉션 타입.

수학시간에 배운 집합 과 완전히 일치한다. (합집합, 교집합, 차집합 등을 지원함)

선언은 아래와같이 할 수 있다.

let myArray: Array<Int> = Array<Int>() // 빈 Int형 배열로 초기화
let myArray1: [Int] = [1, 2, 3]
let myArray2: [Int] = [] // 빈 Int형 배열로 초기화

let myDictionary: Dictionary<String: Int> = [String: Int]() // 빈 Dictionary로 초기화
let myDictionary1: [String: Int] = ["JM": 25, "MJ": 26]
let myDictionary2: [String: Int] = [:]  // 빈 Dictionary로 초기화

let mySet: Set<Int> = Set<Int>()
let mySet1: Set<Int> = [1, 2, 3]
// [Int] 혹은 [String: Int] 같이 줄여여쓸 수 없음

이 외의 관련 메서드들은 추가적으로 사용하면서 학습해보면 될 것 같다.

✏️ 열거형(Enumerations)

Swift에서는 다른언어(C언어..?)와 다르게 열거형을 아주 유용하게 사용할 수 있다.

열거형의 각 case 그 자체가 하나의 값이 되고, 열거형 자체가 하나의 Type으로 정의되기 때문에 기존에 알던 열거형과는 매우 상이하다.

enum Menu {
    case kimbap
    case bulgogi
    case bibimbap
}

print("오늘의 저녁 메뉴는 \(Menu.kimbap)입니다."
// 오늘의 저녁 메뉴는 kimbap입니다.

위의 코드에서 메뉴는 kimbap, bulgogi, bibimbap 외의 것은 고를 수 없게 되어버렸다.

이렇게 Swift에서 열거형은 사용자에게 선택의 폭을 제한하고 싶을 때 사용하면 유용하다.

예를 들어서 에러처리 할 때 에러의 종류라든지..?

✏️ 열거형의 원시값(Raw value)과 연관값(Associated value)

열거형에는 원시값으로 어떤 값을 저장할 수도 있고, 또 연관값이라는 연관된 값을 지정해둘 수도 있다.

예시를 통해 확인해보자.

enum Number: Int {
    case one = 1
    case two = 2
    case ten = 10
}

print(Number.one.rawValue) // 1

enum MainDish {
    case pasta(taste: String)
    case chicken(withSauce: Bool)
    case rice
}

var dinner: MainDish = MainDish.pasta(taste: "로제")
dinner = .rice

특히 추후에 공부할 Swift의 Optional이라는 개념은 바로 이 열거형의 연관값(Associated Value)로 정의되어있으니, 좀 더 자세히 공부해보면 좋을 것 같다.

댓글