🔥 열거형 Case 순회하기

464자
6분

Swift 에서 열거형(Enumeration)은 관련된 값들을 그룹화하여 표현하는 강력한 타입입니다. 때로는 열거형의 모든 case 들을 컬렉션으로 다루는 것이 유용할 수 있는데요, 이번에는 그 방법에 대해 알아보도록 하겠습니다.

열거형 이름 뒤에 : CaseIterable 을 작성하면, 해당 열거형의 모든 case 들을 allCases 속성을 통해 컬렉션으로 접근할 수 있게 됩니다. 아래 예제를 함께 살펴보시죠.

enum Beverage: CaseIterable {
    case coffee, tea, juice
}
 
// allCases 속성을 통해 모든 case의 개수를 셀 수 있습니다.
let numberOfChoices = Beverage.allCases.count
print("\(numberOfChoices) beverages available")
// "3 beverages available" 출력
swift

위 예제에서 Beverage.allCases를 사용하여 Beverage 열거형의 모든 case를 포함하는 컬렉션에 접근했습니다. allCases는 다른 컬렉션과 마찬가지로 사용할 수 있으며, 컬렉션의 요소들은 열거형 타입의 인스턴스입니다. 여기서는 Beverage 값들이겠죠.

위 예제는 case의 개수를 세었고, 아래 예제에서는 for-in 반복문을 사용하여 모든 case를 순회합니다.

for beverage in Beverage.allCases {
    print(beverage)
}
// coffee
// tea
// juice
 
swift

열거형 이름 뒤에 작성한 : CaseIterable 문법은 해당 열거형이 CaseIterable 프로토콜을 준수함을 나타냅니다. 프로토콜에 대한 자세한 내용은 Protocols 문서를 참고해 주세요.

이렇게 CaseIterable 프로토콜을 채택하면 열거형의 모든 case를 손쉽게 다룰 수 있게 되는 것이죠. 예를 들어, 아래와 같이 열거형의 모든 case를 출력하는 함수를 작성할 수 있겠습니다.

func printAllCases<T: CaseIterable>(_ type: T.Type) {
    // 열거형의 모든 case를 순회하며 출력합니다.
    for value in T.allCases {
        print(value)
    }
}
 
printAllCases(Beverage.self)
// coffee
// tea
// juice
swift

CaseIterable 프로토콜은 Associated Value를 가지는 열거형에는 사용할 수 없다는 점에 주의하세요. Associated Value에 대해서는 별도로 다루어 보도록 하죠.

열거형의 case를 컬렉션으로 다루는 기능은 다양한 상황에서 활용할 수 있습니다. 예를 들면:

  • 설정 화면에서 선택 가능한 옵션 목록을 열거형으로 관리하고, allCases를 통해 UI에 표시
  • 게임 캐릭터의 종류를 열거형으로 정의하고, allCases를 이용해 랜덤한 캐릭터 생성
  • 테스트 케이스를 열거형으로 표현하고, allCases로 모든 케이스 실행

등등 열거형과 CaseIterable의 조합은 코드를 더욱 간결하고 가독성 있게 만드는데 도움을 줍니다.

열거형을 순회하는 방법을 익혔으니, 열거형을 활용하는 재미있는 예제 코드를 만들어볼까요?

enum Operation: CaseIterable {
    case add, subtract, multiply, divide
 
    // 열거형의 case에 따라 실제 연산을 수행하는 메서드를 정의합니다.
    func perform(on a: Int, and b: Int) -> Int {
        switch self {
        case .add:
            return a + b
        case .subtract:
            return a - b
        case .multiply:
            return a * b
        case .divide:
            return a / b
        }
    }
}
 
// 순회하며 모든 연산을 수행합니다.
for operation in Operation.allCases {
    let result = operation.perform(on: 10, and: 5)
    print("\(operation): \(result)")
}
// add: 15
// subtract: 5
// multiply: 50
// divide: 2
swift

위 예제는 사칙연산을 나타내는 Operation 열거형을 정의하고, CaseIterable을 채택하여 모든 case를 순회하며 연산을 수행하는 모습을 보여줍니다. 열거형의 case에 따라 서로 다른 연산을 수행하도록 perform(on:and:) 메서드를 구현했는데요, 이렇게 열거형과 메서드를 결합하면 타입에 따라 다른 동작을 캡슐화하는 효과를 얻을 수 있습니다.

이처럼 CaseIterable 프로토콜은 열거형을 더욱 편리하게 다룰 수 있는 기능을 제공하오니, 열거형을 설계할 때 적극 활용해 보시기 바랍니다. 열거형은 단순한 값의 모음 그 이상으로, 코드의 의도를 명확히 하고 추상화를 높이는 강력한 도구임을 기억해 주세요!