Kotlin 1.7.20 호환성 가이드
Kotlin 1.7.20 호환성 가이드
Keep the Language Modern과 Comfortable Updates는 Kotlin 언어 설계의 기본 원칙 두 가지예요. 전자는 언어 진화를 막는 구조는 제거해야 한다는 뜻이고, 후자는 그런 제거를 미리 잘 알려서 코드 마이그레이션을 최대한 매끄럽게 해야 한다는 뜻이에요.
보통 비호환 변경은 기능 릴리스에서만 일어나는데, 이번에는 Kotlin 1.7의 변경이 일으킨 문제가 퍼지는 것을 막기 위해 증분 릴리스에서 두 가지 변경을 도입해야 했어요.
이 문서는 Kotlin 1.7.0과 1.7.10에서 1.7.20으로 마이그레이션할 때 참고할 수 있는 레퍼런스를 제공해요.
본문
기본 용어
이 문서에서는 몇 가지 종류의 호환성을 다뤄요.
- source(소스): 소스 비호환 변경은 예전에는 (경고나 오류 없이) 잘 컴파일되던 코드가 더 이상 컴파일되지 않게 만드는 변경이에요.
- binary(바이너리): 두 바이너리 아티팩트를 서로 바꿔 써도 로딩이나 링크 오류가 나지 않으면 바이너리 호환이라고 불러요.
- behavioral(동작): 같은 프로그램이 변경 적용 전후에 다르게 동작한다면 동작 비호환 변경이라고 해요.
이 정의는 순수 Kotlin에만 해당한다는 점 기억해 두세요. 다른 언어(예를 들어 Java) 관점에서 본 Kotlin 코드의 호환성은 이 문서의 범위 밖이에요.
언어
올바른 제약 조건 처리를 수정하려는 시도 되돌리기
Issue: KT-53813
Component: Core language
Incompatible change type: source
Short summary: KT-52668의 변경을 구현한 뒤 1.7.0에 나타난 타입 추론 제약 조건 처리 문제를 고치려던 시도를 되돌려요. 그 시도는 1.7.10에서 이뤄졌지만, 오히려 새로운 문제를 일으켰어요.
Deprecation cycle:
- 1.7.20: 1.7.0 동작으로 되돌려요.
여러 람다 및 해석과의 문제적인 상호작용을 피하기 위해 일부 빌더 추론 경우 금지
Issue: KT-53797
Component: Core language
Incompatible change type: source
Short summary: Kotlin 1.7은 unrestricted builder inference라는 기능을 도입해서, @BuilderInference로 주석이 달리지 않은 파라미터에 전달된 람다도 빌더 추론의 혜택을 받을 수 있게 했어요. 하지만 함수 호출에 그런 람다가 둘 이상 있으면 여러 문제가 생길 수 있었어요.
Kotlin 1.7.20은 대응하는 파라미터가 @BuilderInference로 주석이 달리지 않은 람다 함수가 둘 이상일 때, 그 람다의 타입 추론을 완료하기 위해 빌더 추론을 써야 한다면 오류를 보고해요.
Deprecation cycle:
- 1.7.20: 그런 람다 함수에 대해 오류를 보고해요.
-XXLanguage:+NoBuilderInferenceWithoutAnnotationRestriction을 쓰면 1.7.20 이전 동작으로 임시로 되돌릴 수 있어요.