Algebraic Data Type이란?

Algebraic Data Type(ADT)은 데이터를 표현하고 구성하는 수학적인 구조를 의미합니다. ADT는 주로 두 가지 방식으로 구성됩니다: Sum Type(합 타입)과 Product Type(곱 타입). ADT는 함수형 프로그래밍 언어에서 많이 사용되며, 데이터의 가능한 상태나 모양을 명확하게 표현하는 데 유용합니다. Scala에서 ADT는 주로 sealed traitcase class로 구현됩니다.

ADT는 다음 두 가지 타입의 조합을 사용해 복잡한 데이터를 구성합니다:

1. Product Type (곱 타입):

Product Type은 여러 필드를 결합하여 하나의 데이터 구조를 만듭니다. Product Type은 다양한 필드를 묶어서 하나의 객체로 표현하는 방식입니다. 이를 "곱"이라고 부르는 이유는 각각의 필드를 포함하는 조합을 만들기 때문입니다.

예시:

case class Person(name: String, age: Int)

위의 PersonProduct Type입니다. nameage 두 필드를 가진 객체로, 여러 필드(속성)를 포함한 하나의 데이터 구조를 표현합니다.

2. Sum Type (합 타입):

Sum Type은 여러 다른 타입 중 하나만을 선택할 수 있는 구조입니다. 이는 "합"이라고 불리는데, 각기 다른 여러 타입 중에서 하나의 값을 표현할 수 있기 때문입니다. Scala에서는 sealed trait 또는 abstract class와 그 하위 타입들로 구현합니다.

예시:

sealed trait Animal
case class Dog(name: String) extends Animal
case class Cat(name: String) extends Animal
case class Bird(name: String) extends Animal

AnimalSum Type이며, Dog, Cat, Bird 중 하나의 타입만을 가질 수 있습니다. 즉, Animal은 여러 다른 타입 중 하나의 인스턴스가 될 수 있는 선택지를 제공합니다.

3. Algebraic Data Type (ADT)의 결합:

ADT는 Product Type과 Sum Type을 조합하여 복잡한 데이터 모델을 만듭니다. 이를 통해 매우 유연하고 구조적인 방식으로 데이터를 표현할 수 있습니다.

예시:

sealed trait Shape
case class Circle(radius: Double) extends Shape
case class Rectangle(width: Double, height: Double) extends Shape
case class Triangle(base: Double, height: Double) extends Shape

ShapeSum Type입니다. Circle, Rectangle, Triangle은 서로 다른 모양을 표현하며, 각 모양은 다시 Product Type을 통해 필요한 속성을 포함하고 있습니다.

패턴 매칭을 통한 ADT 사용:

ADT는 패턴 매칭을 통해 매우 간결하고 명확하게 데이터의 다양한 경우를 처리할 수 있습니다.