Swift/Swift Language

Swift의 Algebraic Data Type

batterflyyin 2021. 3. 24. 09:02

대수적 데이터 타입(Algebraic Data Type)은 함수적 프로그래밍의 용어에서 나왔다.
대수적 데이터 타입은 데이터 타입이 대수적으로 표현되는 관점을 표현한 것으로, 크게 sum typeproduct 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로 다루었다면