10. Swift 열거형(enum)
이 열거형도 굉장히 많이 사용하는 것 중 하나라 정리를 한다. 기본적인 개념들에 대해서는 알고 있으나 얼마나 응용을 해서 개발하는지에 따라 차이가 많이 나는 것 같다.
열거형은 연관된 항목들을 묶어서 표현할 수 있는 타입이다. 이 열거형은 정의한 값 외에는 추가/수정이 불가능하다.
열거형은 다음과 같은 경우 사용하면 유용하게 사용할 수 있다.
- 제한된 선택지를 주고 싶을 때
- 정해진 값 외에는 입력받고 싶지 않을 때
- 예상된 입력 값이 한정되어 있을 때
스위프트의 열거형은 항목별로 값을 가질 수 도 있고 가지지 않을 수도 있다. 스위프트의 열거형은 각 항목이 그 자체로 고유의 값이 될 수 있다. 따라서 시수로 버그가 일어날 가능성을 원천 봉쇄할 수 있다.
스위프트의 주요 기능 중 하나인 옵셔널이 enum(열거형)으로 구현되어 있다.
기본 열거형.
열거형은 enum 키워드로 선언한다.
enum School {
case primary
case elementary
case middle
case high
}
각 항목은 그 자체가 고유의 값이다.
enum School {
case primary, elementary, middle, high
}
와 같은 방식으로 표현할 수 있다.
열거형 변수의 생성 과 값 변경 예시
var eLevel: School = School.primary
var eLeve: School = .primary 로 사용할 수 있다.
원시값.
열거형의 가 항목은 자체로도 하나의 값이지만 항목은 특정 타입으로 지정된 원시 값(Raw Value)도 가질 수 있다. 원시 값을 사용할 때는 rawValue라는 프로퍼티를 통해 접근 가능하다.
enum School: String {
case primary = "유치원"
case elementary = "초등학교"
}
let eLevel : School = School.elementray
print(eLevel.rawValue)
또한 일부 항목에만 원시값을 지정해줄 수 도있다.
enum Numbers: Int {
case zero
case one
case two
case ten = 10
}
// 0, 1, 2, 10
연관값.
열거형 각 항목이 연관 값을 가지게 되면 다른 프로그래밍 언어의 공용체 형태를 띌 수 있는데 열거형 내의 항목(case)이 자신과 연관된 값을 가질 수 있다. 연관 값은 학 항목 옆에 소괄호로 묶어 표현할 수 있다. 다른 항목이 연관 값을 갖는다고 모든 항목이 연관 값을 가질 필요는 없다.
enum MainDish {
case pasta(taste: String)
case pizza(dough: String, topping: String)
case chiken(withSauce: Bool)
case rice
}
var dinner: MainDish = MainDish.pasta(taste: "크림") //크림파스트
다음 예시가 이해를 도와 줄 것 같다.
<여러 열거형의 응용>
enum PastaTaste {
case cream, tomato
}
enum PizzaDough {
case cheeseCrust, this, original
}
enum PizzaTopping {
case pepperoni, cheese, bacon
}
enum MainDish {
case pasta(taste: PastaTaste)
case pizza(dough: PizzaDough, topping: PizzaTopping)
case chicken(withSauce: Bool)
case rice
}
var dinner: MainDish = MainDish.pasta(taste: PastaTaste.tomato)
dinner = MainDish.pizza(dough:PizzaDough.cheeseCrust, topping: PizzaTopping.bacon)
순환 열거형.
열거형 항목의 연관 값이 열거형 자신의 값이고자 할 때 사용,
순환 열겨형을 명시할 땐 indirect키워드를 사용한다. 특정 항목에만 한정하고 싶을 때 case 키워드 앞에 indirect를 붙히고 전체에 적용하고 싶을 땐 enum 키워드 앞에 indirect키워드를 붙이면 된다.
indirect enum ArithmeticExpression {
case number(Int)
case addition(ArithmeticExpression, ArithmeticExpression)
case multiplication(ArithmeticExpression, ArithmeticExpression)
}
열거형에는 정수를 연관 값으로 갖는 number라는 항목이 있고 덧셈을 위한 addition이라는 항목, 곱셈을 위한 multiplication항목이 있다.
let five = ArithmeticExpression.number(5)
let four = ArithmeticExpression.number(4)
let sum = ArithmeticExpression.addition(five, four)
let final = ArithmeticExpression.multiplication(sum, ArithmeticExpression.number(2))
func evaluate(_ expression:ArithmeticExpression) -> Int {
switch expression {
case .number(let value):
return value
case .addition(let left, let right):
return evaluate(left) + evaluate(right)
case .multiplication(let left, let right):
return evaluate(left) * evaluate(right)
}
}
let result: Int = evaluate(final)
print ("(5 + 4 ) * 2 = \(result)") // (5 + 4) *2 = 18
<ArithmeticExpression 열거형을 사용하여 (5 + 4 ) * 2 연산을 구현해보는 예제>
사실 좀 생소한 구문들이다.
열거형 자신의 값이고자 한다는 말이 완전 이해가 되지는 않는다. 예제 코드를 보니 읽을 수 는 있겠으나 응용을 못하겠다.
indirect 키워드는 이진 탐색 트리 등의 순환 알고리즘을 구현할 때 유용하게 사용할 수 있다고 하니 계속 읽어 보는 것이 좋을 듯 하다.
'프로그래밍 > Spring' 카테고리의 다른 글
12. Swift 함수의 매개변수 이름과 전달인자 레이블 (0) | 2019.02.19 |
---|---|
11. Switch문의 골격 (0) | 2019.02.18 |
9. Swift의 배열(Array)과 딕셔너리(Dictionary) 그리고 세트(Set) (0) | 2019.02.16 |
8. Swift 타입 별칭(typealias) & 튜플(Tuple) (0) | 2019.02.15 |
7. Swift Any, AnyObject & nil (0) | 2019.02.14 |