열거형 (Enumerations) - 연관된 값 (Associated Values)

00yhsp·2024년 4월 9일

이전 섹션에서 예제는 열거형 케이스가 어떻게 정의되고 값이 입력되는지 보여 준다. 상수 또는 변수를 Planet.earth 로 설정하고 나중에 값을 체크할 수 있다. 그러나 경우에 따라 이러한 케이스 값과 함께 다른 타입의 값을 저장할 수 있는 것이 유용하다. 이 추가적인 정보를 연관된 값 (associated value)이라고 하며 해당 케이스를 코드에서 값으로 사용할 때마다 달라진다.

주어진 타입의 연관된 값을 저장하기 위해 Swift 열거형을 정의할 수 있고 이 값 타입은 필요에 따라 열거형의 각 케이스에 따라 달라질 수 있다. 이와 유사한 열거형은 다른 프로그래밍 언어에서 식별된 집합체 (discriminated unions), 태그된 집합체 (tagged unions) 또는 변형 가능한 집합체 (variants) 로 알려져 있습니다.

예를 들어 재고 추적 시스템이 2가지 타입의 바코드로 제품을 추적해야 된다고 가정해 보자. 어떤 제품은 숫자 0 에서 9 를 사용하는 UPC 형식의 1D 바코드 라벨이 부착되어 있다. 각 바코드에는 숫자 시스템과 이어서 5자리의 제조업체 코드와 5자리의 제품 코드가 있다. 다음에는 코드가 올바르게 스캔되었는지 확인하기 위해 검사 숫자가 있다:

다른 제품은 어떠한 ISO 8859-1 문자도 사용할 수 있고 2,953개의 문자까지 인코딩할 수 있는 QR 코드 형식의 2D 바코드 라벨이 부착되어 있다:

재고 추적 시스템은 UPC 바코드를 4개의 정수로 된 튜플로 저장하고 QR코드 바코드를 모든 길이의 문자열로 저장하는 것이 편리하다.

Swift에서 두 타입의 바코드를 정의하는 열거형은 다음과 같다

enum Barcode {
    case upc(Int, Int, Int, Int)
    case qrCode(String)
}

이것은 아래와 같이 읽을 수 있다.

"(Int, Int, Int, Int) 타입의 연관된 값을 가진 upc 또는 String 타입의 연관된 값을 가진 qrCode 를 취할 수 있는 Barcode 라는 열거형 타입을 정의한다."

그러면 이러한 타입을 이용하여 새로운 바코드를 생성할 수 있다:

var productBarcode = Barcode.upc(8, 85909, 51226, 3)

이 예제는 productBarcode 라 불리는 새로운 변수를 생성하고 연관된 튜플값인 (8, 85909, 51226, 3) 을 Barcode.upc 의 값으로 할당한다.

같은 상품의 다른 바코드 타입을 할당할 수 있다.

productBarcode = .qrCode("ABCDEFGHIJKLMNOP")

여기서 기존의 Barcode.upc 와 그것의 정수 값은 새로운 Barcode.qrCode 와 그것의 문자열 값으로 대체된다. Barcode 타입의 상수와 변수는 .upc 또는 .qrCode 모두 이것들과 연관된 값으로 저장할 수 있지만 오직 하나의 값만 저장할 수 있다.

스위치 구문으로 열거형 값 일치 (Matching Enumeration Values with a Switch Statement) 에서의 예제와 유사하게 스위치 구문을 이용하여 다른 바코드 타입을 확인할 수 있다. 그러나 이번에는 관련값이 스위치 구문의 일부로 추출된다. switch 케이스의 본문 내에서 사용하기 위해 상수 (let 접두사) 또는 변수 (var 접두사)로 각 연관된 값을 추출한다:

switch productBarcode {
case .upc(let numberSystem, let manufacturer, let product, let check):
    print("UPC: \(numberSystem), \(manufacturer), \(product), \(check).")
case .qrCode(let productCode):
    print("QR code: \(productCode).")
}
// Prints "QR code: ABCDEFGHIJKLMNOP."

열거형 케이스를 위한 연관된 값 모두 상수로 추출하거나 변수로 추출하려면 간결하게 케이스 이름 앞에 let 또는 var 을 선언하면 된다:

switch productBarcode {
case let .upc(numberSystem, manufacturer, product, check):
    print("UPC : \(numberSystem), \(manufacturer), \(product), \(check).")
case let .qrCode(productCode):
    print("QR code: \(productCode).")
}
// Prints "QR code: ABCDEFGHIJKLMNOP."
profile
iOS Dev

0개의 댓글