JAVA · 함수형/Stream
패턴 매칭과 대수적 데이터 타입
sealed 인터페이스와 record를 조합한 대수적 데이터 타입(ADT)과 패턴 매칭입니다.
함수형/Stream고급ADTsealed패턴매칭record
핵심 설명
sealed 인터페이스와 record를 조합한 대수적 데이터 타입(ADT)과 패턴 매칭입니다.
Java code
// 대수적 데이터 타입 (ADT) 정의
sealed interface Expr permits Num, Add, Mul, Neg {}
record Num(double value) implements Expr {}
record Add(Expr left, Expr right) implements Expr {}
record Mul(Expr left, Expr right) implements Expr {}
record Neg(Expr inner) implements Expr {}
public class PatternMatchingADT {
// 패턴 매칭으로 재귀적 평가
static double eval(Expr expr) {
return switch (expr) {
case Num n -> n.value();
case Add a -> eval(a.left()) + eval(a.right());
case Mul m -> eval(m.left()) * eval(m.right());
case Neg n -> -eval(n.inner());
};
}
// 패턴 매칭으로 문자열 변환
static String format(Expr expr) {
return switch (expr) {
case Num n -> String.valueOf(n.value());
case Add a -> "(" + format(a.left()) + " + " + format(a.right()) + ")";
case Mul m -> format(m.left()) + " * " + format(m.right());
case Neg n -> "-" + format(n.inner());
};
}
public static void main(String[] args) {
// (3 + 4) * 2 = 14
Expr expr = new Mul(
new Add(new Num(3), new Num(4)),
new Num(2));
System.out.println(format(expr) + " = " + eval(expr));
// -(5 + 3) = -8
Expr neg = new Neg(new Add(new Num(5), new Num(3)));
System.out.println(format(neg) + " = " + eval(neg));
}
}학습 팁
sealed + record + switch 패턴 매칭 조합은 Java에서 함수형 스타일의 ADT를 깔끔하게 표현합니다. 새 타입 추가 시 모든 switch가 컴파일 에러를 냅니다.
주의할 점
sealed 계층에 새 구현을 추가하면 모든 switch 문을 수정해야 합니다. 이것은 장점(완전성 보장)이지 단점이 아닙니다.
자주 묻는 질문
패턴 매칭과 대수적 데이터 타입란 무엇인가요?
sealed 인터페이스와 record를 조합한 대수적 데이터 타입(ADT)과 패턴 매칭입니다.
패턴 매칭과 대수적 데이터 타입 학습 시 주의할 점은 무엇인가요?
sealed 계층에 새 구현을 추가하면 모든 switch 문을 수정해야 합니다. 이것은 장점(완전성 보장)이지 단점이 아닙니다.
Continue Learning
Java 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.