iOS/Swift

데이터 타입 고급 4편 (열거형 1탄)

밤새는 탐험가89 2024. 1. 7. 22:08

열거형연관된 항목들을 묶은 타입 

프로그래머가 정의한 항목 외에는 추가 / 수정 불가 

 

 

주로 다음과 같은 경우 사용

- 제한된 선택지 제공

- 정해진 값 외에 입력 제한

- 입력 값 한정

 

 

 

기본 열거형 

키워드 enum으로 선언 

각 항목 자체가 고유의 값임

 

Fruit 열거형의 선언

enum Fruit {
    case apple
    case banana
    case kiwi
    case melon
}

// 위와 같은 표현 (한 줄로도 작성 가능)
enum Fruit {
    case apple, banana, kiwi, melon
}

 

 

 

Fruit 열거형 변수의 생성 및 값 변경

var myFruit: Fruit = Fruit.apple
print(myFruit)     // apple

// 위의 코드와 같은 표현
var yourFruit: Fruit = .banana
print(yourFruit)   // banana

// 값 변경
myFruit = .kiwi
print(myFruit)     // kiwi

 

 

 

 

원시 값

열거형의 각 항목 자체도 값으로 사용할 수 있지만, 

원시 값 (Raw Value)도 가질 수 있음

이때 열거형 이름 오른쪽에 타입을 명시하여 사용 

원시 값을 사용하고 싶다면? rawValue 키워드 사용

 

열거형의 원시 값 지정과 사용

enum Fruit: String {
    case apple = "맛 좋은 청송사과"
    case banana = "달디 단 델몬트 바나나"
    case kiwi = "속이 노란 골든키위"
    case melon = "메론바 먹고 싶을땐 멜론"
}

var myFruit: Fruit = Fruit.apple
print("내가 제일 좋아하는 과일은 \(myFruit.rawValue) 입니다.")     
// 내가 제일 좋아하는 과일은 맛 좋은 청송사과 입니다.


// rawValue를 사용하지 않는다면?
// 항목, 그 자체가 호출
print("내가 제일 좋아하는 \(myFruit)")
// 내가 제일 좋아하는 apple

 

 

 

모든 항목에 원시 값을 주지 않아도 됨

String 타입으로 원시 값을 지정했다면?

각 항목은 항목 이름 자체를 원시 값으로 갖게 되지만

 

Int 타입으로 원시 값을 지정했다면?

첫 항목을 기준으로 0부터 1씩 늘어난 값을 갖음

 

열거형의 원시 값 일부 지정 및 자동 처리 - 1

var yourFruit: Fruit = Fruit.strawberry

print("당신이 좋아하는 과일은 \(yourFruit.rawValue)인가요?")
// 당신이 좋아하는 과일은 strawberry인가요?


print("당신이 좋아하는 과일은 \(yourFruit)인가요?")
// 당신이 좋아하는 과일은 strawberry인가요?

 

열거형의 원시 값 일부 지정 및 자동 처리 - 2

enum CountNumbers: Int {
    case zero
    case one = 1
    case two
    case three = 3
    case four
    case five 
}

var myNumber: CountNumbers = CountNumbers.zero
print(myNumber.rawValue)     // 0

myNumber = CountNumbers.one
print(myNumber.rawValue)     // 1

myNumber = CountNumbers.two
print(myNumber.rawValue)     // 2

myNumber = CountNumbers.four
print(myNumber.rawValue )    // 4

 

 

 

연관 값

열거형 내의 항목(case)는 연관 값을 각 항목 옆에 소괄호로 묶어 표현 

 

연관 값을 갖는 열거형

enum Market {
    case apple(taste: String, price: Int)
    case clothes(size: String)
    case pizza(taste: String, price: Int, topping: [String])
    case water
}


var myshopping: Market = Market.apple(taste: "맛 좋은 청송 사과", price: 2000)
print(myshopping)
// apple(taste: "맛 좋은 청송 사과", price: 2000)



myshopping = .clothes(size: "XL")
print(myshopping)
// clothes(size: "XL")


myshopping = .water
print(myshopping)
// water

 

 

 

만약에 clothes의 size가 한정적이라면?

size도 열거형으로 표현하면 됨

 

여러 열거형의 응용

enum ClotheSize {
    case small
    case midium
    case large
}

enum Market {
    case clothes(size: ClotheSize)
}


var myshopping: Market = .clothes(size: ClotheSize.small)
print(myshopping)
// clothes(size: main.ClotheSize.small)


myshopping = .clothes(size: .large)
print(myshopping)
// clothes(size: main.ClotheSize.large)