Swift/Swift Language
Swift의 Algebraic Data Type
batterflyyin
2021. 3. 24. 09:02
대수적 데이터 타입(Algebraic Data Type)은 함수적 프로그래밍의 용어에서 나왔다.
대수적 데이터 타입은 데이터 타입이 대수적으로 표현되는 관점을 표현한 것으로, 크게 sum type과 product type이 존재한다.
스위프트의 대수적 데이터 타입
- Sum Type에는 Enum이 있다.
- Prouct Type에는 Struct와 Tuple이 있다.
요일을 표현하는 데이터 타입을 구현해보자.
enum으로 일요일부터 토요일까지 표현한다면, 다음과 같다.
enum Day {
case sunday
case monday
case tuesday
case wednesday
case thursday
case friday
case saturday
}
- Day는 각각의 요일 case가 값을 0부터 6까지 표현하여 7개의 값을 가진다.
Enum 타입이 Sum Type이라고 불리는 이유는 고정된 case들로 값을 표현할 수 있기 때문이다.
나이를 표현하는 Enum 타입을 살펴보면, 2개의 case로 이루어졌지만, 우리는 Age의 값을 257 까지 표현할 수 있다. (UInt8는 0에서 255까지의 숫자를 나타냄)
enum Age {
case known(UInt8)
case unknown
}
Product Type
- Product type은 가능한 모든 값들을 곱한다.
- 예를 들어, 다음 Struct는 2개의 Bool 값을 갖으므로, 상태는 총 4가지다.
struct BooleanContainer { let first: Bool let second: Bool }
모든 경우의 수를 나열하면 다음과 같다.
BooleanContainer(first: true, second: true)
BooleanContainer(first: true, second: false)
BooleanContainer(first: false, second: true)
BooleanContainer(first: false, second: false)
다음의 Product Type인 PaymentStatus를 Sum Type인 enum 타입으로 바꾸어보자
struct PaymentStatus {
let paymentDate: Date?
let isRecurring: Bool
let paymentType: PaymentType
}
enum PaymentType {
case invoice
case creditCard
case cash
}
enum PaymentStatus {
case invoice(paymentDate: Date?, isRecurring: Bool)
case creditCard(paymentDate: Date?, isRecurring: Bool)
case cash(paymentDate: Date?, isRecurring: Bool)
}
struct 타입을 enum 타입으로 변경하면서 얻는 장점은 무엇일까?
enum 타입 한가지 타입만 다루면 된다. 반면, struct로 다루었다면