default 없는 완전한 switch
컴파일러가 봉인된 모든 하위 타입이 처리되었는지 검증합니다 — default 불필요.
코드 비교
✕ Java 8
// Must add default even though
// all cases are covered
double area(Shape s) {
if (s instanceof Circle c)
return Math.PI * c.r() * c.r();
else if (s instanceof Rect r)
return r.w() * r.h();
else throw new IAE();
}
✓ Java 21+
// sealed Shape permits Circle, Rect
double area(Shape s) {
return switch (s) {
case Circle c ->
Math.PI * c.r() * c.r();
case Rect r ->
r.w() * r.h();
}; // no default needed!
}
이 코드에 문제가 있나요? 알려주세요.
모던 방식이 더 나은 이유
컴파일 시점 안전성
새 하위 타입을 추가하면 컴파일러가 업데이트할 모든 위치를 표시합니다.
죽은 코드 없음
버그를 숨기는 도달 불가능한 default 분기가 없습니다.
대수적 타입
봉인된 클래스 + 레코드 + 완전한 switch = Java에서 올바른 ADT.
이전 방식
필수 default
모던 방식
봉인된 완전성
JDK 버전
21
난이도
중급
JDK 지원
default 없는 완전한 switch
사용 가능
JDK 21 LTS (2023년 9월) 이후 널리 사용 가능
동작 원리
봉인된 타입으로 switch할 때 컴파일러는 가능한 모든 하위 타입을 알고 모든 케이스가 처리되었는지 검증합니다. 새 하위 타입을 추가하면 컴파일러가 이제 불완전한 모든 switch를 표시합니다.
관련 문서