Jerry's Bakery

[iOS] enum과 switch 본문

개발/iOS

[iOS] enum과 switch

_Jerry 2021. 10. 19. 02:14

안녕하세요 Jerry입니다.

 

enum과 switch에 대해 알아보겠습니다.

 

iOS를 공부하면서 정리하는 것이기 때문에 미흡한 점이 있을 수 있습니다. 부족한 점에 대해 댓글 남겨주시면 감사하겠습니다.

 

이 글은 아래 강의를 기반으로 만들어졌습니다.

https://www.youtube.com/watch?v=oWZOFSYS5GE&list=PLpGHT1n4-mAsxuRxVPv7kj4-dQYoC3VVu&index=4&ab_channel=Stanford

 

 

enum은 일종의 구조체 및 클래스와 같으며 블록 데이터 구조를 구성하고 있습니다. 그러나 enum에는 개별 상태만 있습니다. enum의 값은 몇 가지 이산 값 중 하나입니다.

 

아래 코드에서 FastFoodMenuItem이라는 enum을 만들었습니다. enum에는 4가지 메뉴만 존재합니다.

enum FastFoodMenuItem {
    case hambuger
    case fries
    case drink
    case cookie
}

enum은 다른 옵션이 없기 때문에 몇 가지 값을 나타내는 데 좋은 데이터 구조입니다. enum은 value 타입이라는 점에서 구조체와 동일하며, 값을 전달할 때 값만 복사됩니다.

 

Swift의 enum의 특징은 각 상태가 관련 데이터를 가질 수 있다는 점입니다.

 

예를 들어, 위 FastFoodMenuItem에서 햄버거의 패티 개수가 있을 수 있고, 감자튀김의 크기, 음료의 종류 등이 있을 수 있습니다. 하지만 현재 enum에서는 햄버거, 감자튀김, 음료, 쿠키가 있는지에 대해서만 알 수 있습니다. Swift에서는 enum에서 각 case에 관련 데이터가 필요한 경우 아래처럼 사용이 가능합니다.

enum FastFoodMenuItem {
    case hambuger(numberOfPatties: Int)
    case fries(size: FryOrderSize)
    case drink(String, ounces: Int)
    case cookie
}

enum FryOrderSize {
    case large
    case small
}

enum 값을 가진 변수를 선언하려면 아래와 같이 선언하면 됩니다. menuItem은 패티가 2개인 햄버거가 될 것이고, otherItem은 쿠키가 될 것입니다.

var menuItem: FastFoodMenuItem = FastFoodMenuItem.hambuger(numberOfPatties: 2)
var otherItem: FastFoodMenuItem = FastFoodMenuItem.cookie

위 코드는 Swfit의 추론으로 인해 아래처럼 FastFoodMenuItem을 한 개 생략해도 가능합니다. 하지만 둘 다 제거한다면 오류가 발생하기 때문에 주의해야 합니다.

var menuItem = FastFoodMenuItem.hambuger(numberOfPatties: 2)	// 가능
var otherItem = FastFoodMenuItem.cookie				// 가능

var menuItem: FastFoodMenuItem = .hambuger(numberOfPatties: 2)	// 가능
var otherItem: FastFoodMenuItem = .cookie			// 가능

var menuItem = .hambuger(numberOfPatties: 2)			// 불가능
var otherItem = .cookie						// 불가능

이제 변수에 넣은 값을 확인해보기 위해 Switch Case문을 사용해서 출력해 보겠습니다.

아래 코드는 어떤 메뉴를 시켰는지 출력하는 Switch문이고 코드를 실행하였을 때 hambuger가 출력됨을 확인할 수 있습니다.

Swift에서는 Switch문 안에서 FastFoodMenuItem을 켜고 있다는 것을 알 수 있기 때문에 Switch문 안의 FastFoodMenuItem을 생략해도 됩니다.

var menuItem = FastFoodMenuItem.hambuger(numberOfPatties: 2)

switch menuItem {
    case FastFoodMenuItem.hambuger: print("hambuger")
    case FastFoodMenuItem.fries: print("fries")
    case FastFoodMenuItem.drink: print("drink")
    case FastFoodMenuItem.cookie: print("cookie")
}

Switch문에서는 모든 경우를 처리해야 합니다. 이럴 때 enum과 같은 한정된 값을 이용하는 경우에는 관계없지만, 다양한 값이 들어오는 경우 case에 지정하지 않은 모든 경우를 처리하는 default를 사용할 수 있습니다.

 

default를 이용한 코드를 작성해보겠습니다.

아래 코드는 햄버거, 감자튀김을 제외한 나머지는 ohter을 출력하는 switch문입니다.

other을 출력하는 것을 확인할 수 있습니다.

var menuItem = FastFoodMenuItem.cookie

switch menuItem {
    case .hambuger: print("hambuger")
    case .fries: print("fries")
    default: print("other")
}

Switch문은 꼭 enum에 대해 실행 가능한 것은 아닙니다. 만약 String과 같은 문자열을 넣게 된다면 아래처럼 default를 사용해 case에 해당하지 않는 값을 처리할 수 있도록 해야 합니다.

var hello = "hello"

switch hello {
  case "hello": print("hello")
  case "bye": print("bye")
  default: print("default")

그리고 Switch문의 case가 각각 한 줄일 필요는 없습니다. 아래 코드를 실행했을 때 여러 줄이 출력되는 것을 확인할 수 있습니다.

var menuItem = FastFoodMenuItem.hambuger(numberOfPatties: 2)

switch menuItem {
    case .hambuger:
        print("hambuger")
        print("hambuger")
    case .fries: print("fries")
    default: print("other")
}

햄버거의 패티 개수를 출력하고 싶을 때는 아래 코드처럼 case에 매개변수를 추가하면 됩니다.

menuItem에서 FastFoodMenuItem.hambuger(numberOfPatties: 2)를 선언하고 switch문으로 들어갔을 때. hambuger 타입을 매개변수로 사용하고 있는 case가 있으면 알맞게 출력합니다. 아래 코드에서는 "2 patty hambuger"가 출력됩니다.

var menuItem = FastFoodMenuItem.hambuger(numberOfPatties: 2)

switch menuItem {
    case .hambuger(let pattyCount): print("\(pattyCount) patty hambuger")
    case .fries: print("fries")
    default: print("other")
}

그리고 enum은 구조체 및 클래스와 같은 함수를 가질 수 있습니다.

그리고 변수를 가질 수 있지만 계산된 var만 가질 수 있습니다. enum이 저장되는 장소가 case이기 때문에 실제 저장소가 있는 변수를 가질 수 없습니다.

 

FastFoodMenuItem enum에서 스페셜 주문인지 알 수 있는 함수를 생성했습니다. 햄버거 패티가 2개 이상이거나, 감자튀김이나 쿠키가 포함되었거나, 음료가 16온스 이상이라면 스페셜 주문이라고 가정했습니다. 만약 스페셜 주문이라면 true를 반환합니다.

 

아래 코드는 isSpecialOrder 변수를 선언하여 isIncludedInSpecialOrder 함수를 호출하여 햄버거가 스페셜 주문인지 확인하고 "스페셜 주문입니다"를 출력합니다. 아래 코드에서 패티가 2개이기 때문에 "스페셜 주문입니다"가 출력됩니다.

enum FastFoodMenuItem {
    case hambuger(numberOfPatties: Int)
    case fries(size: FryOrderSize)
    case drink(String, ounces: Int)
    case cookie
    
    func isIncludedInSpecialOrder(number: Int) -> Bool {
        switch self {
            case .hambuger(let pattyCount): return pattyCount == number
            case .fries, .cookie: return true
            case .drink(_, let ounces): return ounces == 16
        }
    }
}

enum FryOrderSize {
    case large
    case small
}

var menuItem = FastFoodMenuItem.hambuger(numberOfPatties: 2)

var isSpecialOrder = menuItem.isIncludedInSpecialOrder(number: 2)

if isSpecialOrder { print("스페셜 주문입니다.") }
else { print("스페셜 주문이 아닙니다.") }

enum의 가장 대표적인 에는 Optional입니다.

Optional에 대한 정보는 아래 페이지에서 확인하실 수 있습니다.

 

[iOS] Optional(옵셔널), Optional Binding(옵셔널 바인딩), Optional Chaining(옵셔널 체이닝)

안녕하세요 Jerry입니다. Optional과 옵셔널 언래핑 방법에 대해 알아보겠습니다. iOS를 공부하면서 정리하는 것이기 때문에 미흡한 점이 있을 수 있습니다. 부족한 점에 대해 댓글 남겨주시면 감사

jerry-bakery.tistory.com

 

Comments