[Swift]데이터 타입 - 열거형(enum)

choe_ju·2023년 9월 27일

📖 열거형이란?

  • 사용자가 만들수 타입으로 연관된 항목들을 묶어 표현하는 타입입니다.
  • 데이터를 기록하기에 정의한 항목 내에서만 추가, 수정이 가능하며, swift에서 열거형은 해당 타입을 고유 타입으로 인정하기에 실수로 버그가 일어날 가능성을 막습니다.
  • 이러한 점이 있기에 만약 해당 조건을 활용하여 몇가지 조건사항이 한정되어 있는 경우 열거형을 활용하여 표현하면 가독성을 높일 수 있습니다.

💡 열거형 특징

  • 조건사항이 한정된 경우 자주 사용
  • 처음 정의한 항목 이외에 추가/수정 불가

📎 열거형(enum) 선언 방법 

선언은 'enum'으로 선언하고 'case'를 통해 고유의 값을 생성합니다.

enum WeekDays {	//대문자로 시작해야 함
    case mon
    case tue
    case wed
    case thu
    case fri
    case sat
    case sun
    
    //위의 선언 방식과 동일함
    //case mon, tue, wed, thu, fri, sat, sun
}

📎 원시값  

  • 열거형에서 각 항목에 대해 원시값을 부여할 수 있습니다. 부여 방식은 아래와 같이 열거형 오른쪽에 원시값의 타입을 명시하고 각 항목에 맞는 원시값을 부여해줄 수 있습니다. 이후 해당 원시값은 rawValue를 통해 가져올 수 있습니다. 단 반환값이 옵셔널 값으로 반환되기에 상황에 따라 맞춰 활용하여야 합니다.

(원시값을 부여할때 모든 항목에 원시값을 꼭 부여할 필요는 없습니다.) => 몇가지만 지정 가능

enum WeekDays: String { // 열겨형명: 원시값타입
    case mon = "월"	// 고유값 : mon, 원시값 : "월"
    case tue = "화"
    case wed = "수"
    case thu = "목"
    case fri = "금"
    case sat = "토"
    case sun = "일"
    
    //위의 선언 방식과 동일함
    //case mon = "월", tue = "화", wed = "수", thu = "목", fri = "금", sat = "토", sun = "일"
}

var today: WeekDays = Weekdays.mon
print("오늘 요일 : \(today.rawValue)")	//열거형 뒤에 .rawValue를 통해 해당 원시값을 가져옴
// 출력 결과 => 오늘 요일 : 월

추가로 원시값 타입을 지정하고 원시값을 입력하지 않은 경우에는 원시값이 자동으로 저장됩니다.

아래와 같이 원시값 타입이 Int인 경우 위부터 순서대로 0, 1, 2, ... 이 원시값으로 부여되고, String인 경우에는 case에서 정의한 명칭 그대로 원시값을 가지게 됩니다.

enum WeekDays: 원시값타입 {
    		//Int인 경우	String인 경우
    case mon	//0		"mon"
    case tue	//1		"tue"
    case wed	//2		"wed"
    case thu	//3		"thu"
    case fri	//4		"fri"
    case sat	//5		"sat"
    case sun	//6		"sun"
}

📎 연관값 

  • 연관값은 열거형의 각 케이스에 구체적인 추가정보를 저장하기 위해 사용합니다. 해당 연관값을 지정하면 열거형 선언 시 데이터 값이 정해지는 것이 아니라 새로운 열거형을 선언 할 때 값을 튜플형태로 부여합니다.
  • 연관값 선언은 아래와 같이 각 케이스 항목 뒤 "()"를 통해 속성값을 부여하며 속성명은 선택적으로 사용가능합니다.
enum Order {
    //각 항목에 연관된 값 ()내부에 추가로 표현
    case drink(menu: String, state: Int)	// state >> 0: hot, 1:ice
    case cake(menu: String)
    case bread(menu: String)	// 속성명 없이도 사용 가능 => case bread(String)
}

//열거형을 사용하여 새로 생성할 때마다 값 부여 >> 자료형 제한 없음
var order1 = Order.drink(menu: "cafeLatte", state : 0)
var order2 = Order.cake(menu: "cheesecake")

만약 해당 속성값도 한정적일 경우 열거형을 속성값으로 선언하여 표현할 수 있습니다.

위의 코드에서 메뉴가 한정적으로 정해져 있는 경우 아래와 같이 열거형을 속성값으로 부여해 사용 가능합니다.

enum DrinkMenu{
    case american, cafeLatte, cafeMocha, cappuccino
}

enum DrinkState{
    case hot, ice
}

enum CakeMenu{
    case cheesecake, chocolatecake, strawberrycake
}

enum CakeMenu{
    case croissant, bagel
}

enum Order {
    //각 항목에 연관된 값 ()내부에 추가로 표현
    case drink(menu: DrinkMenu, state: DrinkState)
    case cake(menu: CakeMenu)
    case bread(menu: BreadMenu)
}

🚨 단!! 원시값과 연관값은 동시 사용불가능합니다!!

0개의 댓글