HIT해

[Swift 기초문법 - 63] 값을 동반한 enum 본문

Swift/Swift 기초문법

[Swift 기초문법 - 63] 값을 동반한 enum

힛해 2024. 8. 21. 00:36
728x90

값을 동반한 enum

Swift에서 열거형은 각 케이스에 단순한 이름만을 할당하는 것이 아니라, 각 케이스가 값을 가질 수 있는 기능도 제공한다.

이 값은 "연관값" 이라고 부르며 각 케이스와 함께 저장되고 다룰 수 있다.

 

연관값을 가진 enum의 기본 개념

연관값을 가진 enum은 특정 케이스가 하나 이상의 추가 데이터를 가질 수 있게 한다.

예를 들어 enum을 사용하여 다양한 형태의 데이터를 표현할 때 연관값을 사용할 수 있다.

enum Barcode {
    case upc(Int, Int, Int, Int)
    case qrCode(String)
}
  • upc 케이스는 4개의 Int 값을 연관값으로 가진다
  • qrCode 케이스는 하나의 String 값을 연관값으로 가진다.

 

열거형 케이스 생성

 

연관값을 가진 열거형 케이스를 생성할 때는 해당 케이스와 함께 필요한 값을 제공해야한다.

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

productBarcode = .qrCode("ABCDEFGHIJKLMNOP")
print(productBarcode)

 

연관값이 될 수 있는 것들

enum SomeEnum {
	case doSomething
    case saySomthing(word : String = "")
    case sayHello(String) // String
    case sayGoodBye(String?) // 옵셔널
    case someAction(action: () -> Void) // Closure
    case someValues(values: (name:String, age:Int) // 튜플
}

 

위와 같이 다양한 값이 연관값으로 들어올 수 있다.


연관값 접근 및 사용

열거형 케이스에 저장된 연관값에 접근하려면 switch 구문이나 if case 구문을 사용하여 접근할 수 있다.

 

1. switch 구문을 사용한 접근

switch productBarcode {
case .upc(let numberSystem, let manufacturer, let product, let checkDigit):
    print("UPC: \(numberSystem), \(manufacturer), \(product), \(checkDigit)")
case .qrCode(let productCode):
    print("QR 코드: \(productCode)")
}

 

2. if case 구문을 사용한 접근

if case let Barcode.qrCode(code) = productBarcode {
    print("QR 코드: \(code)")
}

연관값과 일반 값의 차이

연관값은 열거형의 각 인스턴스와 함께 저장되는 값이다.

반면 일반적으로 enum의 경우 각 케이스 자체에 값이 할당되며 모든 인스턴스가 동일한 값을 가지게 된다.

일반적인 enum 값

enum Planet: Int {
    case mercury = 1, venus, earth, mars
}

 

연관값을 가진 enum

enum MediaType {
    case audio(String)
    case video(String)
}

let audioFile = MediaType.audio("mp3")
let videoFile = MediaType.video("mp4")

 

이 경우 각 케이스는 문자열 형태의 연관값을 가지며, 서로 다른 데이터를 가질 수 있다.