본문 바로가기
프로그래밍 패러다임/함수형 프로그래밍

함수형 코딩에서의 대수적 데이터 타입(ADTs ; Algebraic Data Types)

by 시니성 2023. 11. 27.

"대수적"이라는 용어는 수학과 함수형 프로그래밍에서 다소 다른 맥락으로 사용됩니다. 각각의 맥락에서 이 용어의 의미와 사용을 자세히 설명하고, 그 차이점을 비교해보겠습니다.

수학에서의 "대수적(Algebraic)" 개념

수학적 정의:

  • 대수학(Algebra)은 수학의 한 분야로, 숫자와 연산을 일반화하고, 문자와 심볼을 사용하여 수학적 구조, 관계, 양을 표현합니다.
  • 대수적 개념은 대수학에서 다루는 구조들(예: 집합, 벡터 공간, 군, 환 등)과 이러한 구조들의 속성 또는 연산을 포함합니다.

예시:

  • 대수적 구조의 예로는 군(Group), 환(Ring), 체(Field) 등이 있습니다. 이들은 특정한 연산(예: 덧셈, 곱셈)과 함께 집합을 구성하여 특정한 규칙을 따릅니다.
  • 예를 들어, 정수 집합은 덧셈에 대해 군을 형성하며, 이는 대수적 구조의 한 예입니다.

함수형 프로그래밍에서의 "대수적(Algebraic)" 개념

함수형 프로그래밍 정의:

  • 함수형 프로그래밍에서 대수적 타입(Algebraic Data Types, ADTs)은 데이터 타입을 정의하는 방법입니다.
  • 이는 합집합 타입(Sum Types)곱집합 타입(Product Types)으로 나뉩니다. 합집합 타입은 여러 타입 중 하나를 나타내며, 곱집합 타입은 여러 타입을 결합하여 새로운 타입을 형성합니다.

합집합 타입 (Sum Types)

합집합 타입은 여러 타입 중 하나를 나타내는 타입입니다. Kotlin에서는 sealed class를 사용하여 합집합 타입을 표현합니다. 각 하위 클래스는 가능한 값 중 하나를 나타냅니다. 이는 "이거나(OR)" 관계를 나타냅니다.

곱집합 타입 (Product Types)

곱집합 타입은 여러 타입을 함께 묶어 새로운 타입을 생성하는 것입니다. Kotlin에서는 일반 클래스나 데이터 클래스(data class)를 사용하여 곱집합 타입을 표현합니다. 이는 "그리고(AND)" 관계를 나타냅니다.

코틀린 예제 코드

이제 코틀린을 사용하여 대수적 타입의 예를 들어보겠습니다:

// 대수적 타입의 예: 합집합 타입 (Sum Type)
sealed class Shape  // Shape는 Circle, Rectangle 중 하나를 가질 수 있는 합집합 타입입니다.
data class Circle(val radius: Double) : Shape()  // Circle은 Shape의 구체적인 타입입니다.
data class Rectangle(val width: Double, val height: Double) : Shape()  // Rectangle도 Shape의 구체적인 타입입니다.

// 대수적 타입의 예: 곱집합 타입 (Product Type)
data class Point(val x: Double, val y: Double)  // Point는 Double 타입의 x와 y를 결합한 곱집합 타입입니다.

// 사용 예시
fun main() {
    val circle: Shape = Circle(5.0)  // Shape 타입의 circle
    val rectangle: Shape = Rectangle(3.0, 4.0)  // Shape 타입의 rectangle
    val point: Point = Point(1.0, 2.0)  // Point 타입의 인스턴스

    // Shape의 인스턴스는 Circle 또는 Rectangle이 될 수 있습니다. 이는 합집합 타입의 특징을 보여줍니다.
    // Point의 인스턴스는 x와 y 좌표를 모두 포함합니다. 이는 곱집합 타입의 특징을 보여줍니다.
}

이 예제에서 Shape 클래스는 합집합 타입으로, Circle 또는 Rectangle 중 하나의 형태를 취할 수 있습니다. 이는 "이거나" 관계를 나타내며, 이러한 타입은 패턴 매칭과 잘 어울립니다.

반면, Point 클래스는 곱집합 타입으로, 두 개의 Double 값인 xy를 함께 포함합니다. 이는 "그리고" 관계를 나타내며, 복합적인 데이터 구조를 만드는 데 유용합니다.

대수적 타입을 사용하면 복잡한 데이터 구조와 로직을 명확하고 안전하게 모델링할 수 있으며, 특히 함수형 프로그래밍에서 코드의 안전성과 가독성을 높이는 데 도움이 됩니다.

비교

공통점:

  • 두 분야 모두 "구조"와 "규칙"에 중점을 두고 있습니다. 수학에서는 대수적 구조와 연산 규칙에, 함수형 프로그래밍에서는 데이터의 구조와 타입 조합에 관심을 가집니다.

차이점:

  • 수학적 대수: 추상적인 개념과 수학적 구조에 초점을 맞추며, 일반적으로 숫자와 심볼의 연산과 관련된 규칙을 탐구합니다.
  • 함수형 프로그래밍의 대수: 소프트웨어 설계에 초점을 맞추며, 데이터 타입을 조합하고 구성하는 방법에 관한 것입니다. 이는 프로그램의 안정성과 가독성을 높이는 데 중요한 역할을 합니다.

수학적 대수는 보다 광범위하고 추상적인 개념을 포괄하는 반면, 함수형 프로그래밍에서의 대수적 타입은 소프트웨어 개발에 있어 구체적인 데이터 구조와 타입 시스템의 조합에 중점을 둡니다. 이

두 분야는 각각의 맥락에서 "대수적"이라는 용어를 사용하지만, 그 의미와 적용 범위에 있어서는 상당한 차이가 있습니다.