sealed 타입을 공개 API에 노출하면 하위 타입 추가가 런타임 MatchException으로 터짐
- 다른 모듈이 다시 컴파일되지 않은 상태에서 sealed 인터페이스에 TypeC가 추가되면 MatchException이 런타임에 던져짐 (컴파일 오류가 나지 않음)
- sealed 타입은 exhaustiveness 검사로 switch 식이 모든 경우를 다뤘는지 컴파일러가 확인해서 default 절이 없어도 됨
- 저자는 sealed 타입이 컴포넌트 내부에서는 유용하지만 라이브러리 같은 공개 API에 쓰면 하위 타입 추가가 호환성을 깨기 쉽다고 결론 내림
- 저자는 JEP 524의 PEM 암호 객체 미리보기 API가 sealed 인터페이스를 공개 API에 넣고 패턴 매칭을 권장해서 같은 실수를 한다고 지적함
Hacker News opinions
재귀 record 패턴은 자바에서 이미 되는데 리터럴 패턴은 아직 프리뷰일 수도 있음. case A(B(true, var c)) 식으로 한 번에 풀어낼 수 있더라.
자바가 코틀린을 따라잡는다는 말은 잘 모르겠음. 자바는 패턴 매칭을 21에서 이미 넣었고 코틀린은 아직 그 기능이 없음.
자바는 일부러 기능을 천천히 넣는 언어임. 기능을 많이 늘리는 것보다 복잡도를 낮게 두는 게 중요하다는 입장이고, 자바 플랫폼 개발자의 약 90%가 자바 언어를 계속 쓴다고 함.
자바는 유행을 쫓기보다 다른 언어에서 검증된 기능을 늦게 받아들이는 게 좋음. 나는 C#에서 제네릭이랑 타입 소거 때문에 자바보다 더 자주 싸우게 되더라.
자바는 아직 문자열 템플릿이 정식으로 없음. Java 23에 넣으려다 프리뷰에서 빠지고 그 뒤로 소식이 안 보임.
JVM이 괜히 JVM인 게 아님. 구글 지원이 없었으면 코틀린은 지금쯤 사라졌을 거라는 말도 있음.
스칼라 쓰던 입장에서 말하면 컴파일 시간이 제일 큰 문제였음. sbt도 처음 배울 때 헷갈렸음. 작은 프로젝트면 요즘 자바, 큰 팀 미션 크리티컬이면 스칼라 쪽을 고를 듯함.
2018년 얘기 같은데 내가 아는 큰 회사들은 다시 자바로 많이 옮겨갔음. LLM 시대라 스택 옮기는 비용이 줄면 또 바뀔 수도 있음.
나는 프론트 작업이 많아서 TypeScript를 씀. ts-pattern 같은 라이브러리 없이도 never 타입으로 exhaustive 체크는 가능함.
굳이 라이브러리까지 갈 필요는 없음. function exhaustive(witness: never): never 같은 헬퍼 하나면 충분함.
default가 필요 없다는 말은 틀린 것 같음. 여기 switch는 String 리터럴 케이스만 있어서 default가 없으면 안 되고, switch 식은 모든 경우를 다 커버해야 함.