대수적 데이터 타입
도메인을 모델링합니다
대수적 데이터 타입은(는) CoddyKit의 무료 Scala for Backend Engineering & Functional Programming 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Scala for Backend Engineering & Functional Programming 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Scala for Backend Engineering & Functional Programming 강의에는 총 4개의 강의가 포함되어 있습니다.
ADT란 무엇인가요?
대수적 데이터 타입(ADT)은 다른 타입을 조합해 만든 타입입니다. Scala에서는 sealed trait와 case class, case object 변형을 사용해 ADT를 모델링합니다.
ADT를 사용하면 도메인 데이터의 형태를 정확하게 표현할 수 있습니다.
합 타입
합 타입은 값이 여러 대안 중 하나임을 의미합니다(OR). 신호등은 빨간색 OR 노란색 OR 초록색입니다.
봉인된 트레이트와 여러 변형으로 이를 표현합니다.
sealed trait Light
case object Red extends Light
case object Yellow extends Light
case object Green extends Light
object Main {
def main(args: Array[String]): Unit = {
val l: Light = Yellow
println(l)
}
}곱 타입
곱 타입은 값이 여러 필드를 함께 가진다는 의미입니다(AND). 점은 x AND y를 가집니다.
케이스 클래스는 곱 타입입니다.
case class Point(x: Int, y: Int)
object Main {
def main(args: Array[String]): Unit = {
val p = Point(3, 4)
println(s"${p.x} and ${p.y}")
}
}합 타입과 곱 타입 조합하기
실제 ADT는 두 가지를 모두 조합합니다. 즉, 변형이 케이스 클래스(곱 타입)인 봉인된 트레이트(합 타입)입니다.
여기서 Shape는 반지름이 있는 Circle OR 너비와 높이가 있는 Rectangle입니다.
sealed trait Shape
case class Circle(radius: Double) extends Shape
case class Rectangle(w: Double, h: Double) extends Shape
object Main {
def main(args: Array[String]): Unit = {
val s: Shape = Rectangle(3, 4)
println(s)
}
}ADT 다루기
ADT는 변형을 패턴 매칭하여 처리합니다. 각 분기는 하나의 도형을 처리합니다.
sealed trait Shape
case class Circle(radius: Double) extends Shape
case class Rectangle(w: Double, h: Double) extends Shape
object Main {
def area(s: Shape): Double = s match {
case Circle(r) => 3.14159 * r * r
case Rectangle(w, h) => w * h
}
def main(args: Array[String]): Unit = {
println(area(Circle(2)))
println(area(Rectangle(3, 4)))
}
}도메인 모델링하기
ADT를 사용하면 잘못된 상태를 표현할 수 없게 됩니다. 결제 수단을 유효한 선택지로 이루어진 닫힌 집합으로 모델링해 보세요.
sealed trait PaymentMethod
case class CreditCard(number: String) extends PaymentMethod
case class BankTransfer(iban: String) extends PaymentMethod
case object Cash extends PaymentMethod
object Main {
def main(args: Array[String]): Unit = {
val m: PaymentMethod = Cash
println(m)
}
}재귀적 ADT
ADT는 자기 자신을 참조할 수 있으며, 이를 통해 트리와 리스트를 모델링합니다. 여기서는 간단한 이진 트리를 살펴봅니다.
sealed trait Tree
case object Leaf extends Tree
case class Node(value: Int, left: Tree, right: Tree) extends Tree
object Main {
def main(args: Array[String]): Unit = {
val t: Tree = Node(1, Leaf, Node(2, Leaf, Leaf))
println(t)
}
}재귀적 ADT 접기
재귀와 매칭을 함께 사용하면 전체 구조를 처리할 수 있습니다. 여기서는 트리의 모든 값을 더합니다.
sealed trait Tree
case object Leaf extends Tree
case class Node(value: Int, left: Tree, right: Tree) extends Tree
object Main {
def sum(t: Tree): Int = t match {
case Leaf => 0
case Node(v, l, r) => v + sum(l) + sum(r)
}
def main(args: Array[String]): Unit = {
val t = Node(1, Node(2, Leaf, Leaf), Node(3, Leaf, Leaf))
println(sum(t))
}
}ADT를 사용하는 이유
ADT가 강력한 이유는 다음과 같습니다.
- 데이터를 합과 곱으로 정확하게 표현합니다.
- 잘못된 상태를 생성할 수 없게 합니다.
- 모든 경우를 다루는 패턴 매칭과 완벽하게 어울립니다.
- 트리와 리스트 같은 재귀적 구조로 확장할 수 있습니다.
ADT와 상속 비교
전통적인 객체 지향 프로그래밍에서는 동작이 하위 클래스 곳곳에 흩어집니다. ADT는 데이터 정의를 닫힌 상태로 유지하고, 패턴 매칭을 수행하는 함수에 동작을 배치합니다.
데이터와 동작을 분리하는 것은 함수형 설계의 대표적인 특징입니다.
하나로 합쳐 보기
모든 변형을 처리하는 함수를 포함한 완전한 소형 ADT입니다.
sealed trait Json
case class JNum(n: Double) extends Json
case class JStr(s: String) extends Json
case object JNull extends Json
object Main {
def render(j: Json): String = j match {
case JNum(n) => n.toString
case JStr(s) => "\"" + s + "\""
case JNull => "null"
}
def main(args: Array[String]): Unit = {
List(JNum(3.0), JStr("hi"), JNull).foreach(j => println(render(j)))
}
}빠른 확인
ADT에 대한 이해도를 확인해 보세요.
복습
대수적 데이터 타입을 만드는 방법을 배웠습니다.
- 합 타입: 여러 변형을 가진 봉인된 트레이트(OR)
- 곱 타입: 필드를 가진 케이스 클래스(AND)
- 두 타입을 조합해 도메인을 정확하게 모델링합니다.
- ADT는 재귀적일 수 있습니다(트리, 리스트).
- 패턴 매칭으로 ADT를 처리합니다.
자주 묻는 질문
“대수적 데이터 타입” 강의는 무료인가요?
네 — “대수적 데이터 타입” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Scala for Backend Engineering & Functional Programming 강의 전체를 잠금 해제할 수 있습니다. Scala for Backend Engineering & Functional Programming 강의에는 총 4개의 강의가 포함되어 있습니다.
“대수적 데이터 타입”에서 뭘 배우나요?
도메인을 모델링합니다 브라우저에서 직접 실행하는 실습 코드로 Scala for Backend Engineering & Functional Programming을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Scala for Backend Engineering & Functional Programming을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Scala for Backend Engineering & Functional Programming은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“대수적 데이터 타입” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Scala for Backend Engineering & Functional Programming 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Scala for Backend Engineering & Functional Programming 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.