본문 바로가기
프로그래밍/Spring

10. Swift 열거형(enum)

by Mr-후 2019. 2. 17.
반응형

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 키워드는 이진 탐색 트리 등의 순환 알고리즘을 구현할 때 유용하게 사용할 수 있다고 하니 계속 읽어 보는 것이 좋을 듯 하다. 




반응형