본문 바로가기

Swift/Swift Language

Swift의 Algebraic Data Type

대수적 데이터 타입(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로 다루었다면