Algebraic Data Type(ADT)은 데이터를 표현하고 구성하는 수학적인 구조를 의미합니다. ADT는 주로 두 가지 방식으로 구성됩니다: Sum Type(합 타입)과 Product Type(곱 타입). ADT는 함수형 프로그래밍 언어에서 많이 사용되며, 데이터의 가능한 상태나 모양을 명확하게 표현하는 데 유용합니다. Scala에서 ADT는 주로 sealed trait와 case class로 구현됩니다.
ADT는 다음 두 가지 타입의 조합을 사용해 복잡한 데이터를 구성합니다:
Product Type은 여러 필드를 결합하여 하나의 데이터 구조를 만듭니다. Product Type은 다양한 필드를 묶어서 하나의 객체로 표현하는 방식입니다. 이를 "곱"이라고 부르는 이유는 각각의 필드를 포함하는 조합을 만들기 때문입니다.
case class Person(name: String, age: Int)
위의 Person
은 Product Type입니다. name
과 age
두 필드를 가진 객체로, 여러 필드(속성)를 포함한 하나의 데이터 구조를 표현합니다.
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
Animal
은 Sum Type이며, Dog
, Cat
, Bird
중 하나의 타입만을 가질 수 있습니다. 즉, Animal
은 여러 다른 타입 중 하나의 인스턴스가 될 수 있는 선택지를 제공합니다.
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
Shape
는 Sum Type입니다. Circle
, Rectangle
, Triangle
은 서로 다른 모양을 표현하며, 각 모양은 다시 Product Type을 통해 필요한 속성을 포함하고 있습니다.
ADT는 패턴 매칭을 통해 매우 간결하고 명확하게 데이터의 다양한 경우를 처리할 수 있습니다.