Kotlin 1.6.x 호환성 가이드
언어의 현대성 유지(Keeping the Language Modern) 및 _편안한 업데이트(Comfortable Updates)_는 Kotlin 언어 디자인의 기본 원칙입니다. 전자는 언어의 진화를 방해하는 구조를 제거해야 함을 의미하며, 후자는 코드 마이그레이션을 가능한 한 원활하게 만들기 위해 이러한 제거가 사전에 잘 전달되어야 함을 의미합니다.
대부분의 언어 변경 사항은 업데이트 변경 로그나 컴파일러 경고와 같은 다른 채널을 통해 이미 발표되었지만, 이 문서는 이를 모두 요약하여 Kotlin 1.5에서 Kotlin 1.6으로 마이그레이션하기 위한 전체 참조를 제공합니다.
기본 용어
이 문서에서는 몇 가지 종류의 호환성을 소개합니다.
- 소스(source): 소스 호환되지 않는 변경은 이전에 잘 컴파일되던 코드(오류나 경고 없이)가 더 이상 컴파일되지 않게 함을 의미합니다.
- 바이너리(binary): 두 바이너리 아티팩트를 서로 교체했을 때 로딩 또는 링크 오류가 발생하지 않는 경우 이를 바이너리 호환이라고 합니다.
- 동작(behavioral): 변경을 적용하기 전과 후에 동일한 프로그램이 서로 다른 동작을 보일 때 이를 동작 호환되지 않는 변경이라고 합니다.
이러한 정의는 순수 Kotlin에 대해서만 제공된다는 점을 기억하십시오. 다른 언어 관점(예: Java)에서의 Kotlin 코드 호환성은 이 문서의 범위를 벗어납니다.
언어 (Language)
enum, sealed, Boolean 대상을 가진 when 문을 기본적으로 망라적으로 만들기
이슈: KT-47709
컴포넌트: 코어 언어
호환되지 않는 변경 유형: 소스
요약: Kotlin 1.6은 enum, sealed 또는 Boolean 대상을 가진
when문이 망라적(exhaustive)이지 않은 경우 경고를 표시합니다.지원 중단 주기:
- 1.6.0: enum, sealed 또는 Boolean 대상을 가진
when문이 망라적이지 않은 경우 경고 도입 (progressive 모드에서는 오류)- 1.7.0: 이 경고를 오류로 격상
when-with-subject에서 혼동을 주는 문법 지원 중단
이슈: KT-48385
컴포넌트: 코어 언어
호환되지 않는 변경 유형: 소스
요약: Kotlin 1.6은
when조건식에서 몇 가지 혼동을 주는 문법 구조를 지원 중단합니다.지원 중단 주기:
- 1.6.20: 해당 식에 대해 지원 중단 경고 도입
- 1.8.0: 이 경고를 오류로 격상
- >= 1.8: 지원 중단된 일부 구조를 새로운 언어 기능을 위해 재사용
컴패니언 및 중첩 객체의 상위 생성자 호출에서 클래스 멤버 접근 금지
이슈: KT-25289
컴포넌트: 코어 언어
호환되지 않는 변경 유형: 소스
요약: Kotlin 1.6은 컴패니언 및 일반 객체의 상위 생성자 호출 인자에서 해당 인자의 수신 객체가 포함된 선언을 참조하는 경우 오류를 보고합니다.
지원 중단 주기:
- 1.5.20: 문제가 되는 인자에 대해 경고 도입
- 1.6.0: 이 경고를 오류로 격상,
-XXLanguage:-ProhibitSelfCallsInNestedObjects를 사용하여 일시적으로 1.6 이전의 동작으로 되돌릴 수 있음
타입 널 가능성 개선 사항
이슈: KT-48623
컴포넌트: Kotlin/JVM
호환되지 않는 변경 유형: 소스
요약: Kotlin 1.7은 Java 코드에서 타입 널 가능성(nullability) 어노테이션을 로드하고 해석하는 방식을 변경합니다.
지원 중단 주기:
- 1.4.30: 더 정밀한 타입 널 가능성이 오류로 이어질 수 있는 경우에 대해 경고 도입
- 1.7.0: Java 타입의 널 가능성을 더 정밀하게 추론,
-XXLanguage:-TypeEnhancementImprovementsInStrictMode를 사용하여 일시적으로 1.7 이전의 동작으로 되돌릴 수 있음
서로 다른 숫자 타입 간의 암시적 강제 변환 방지
이슈: KT-48645
컴포넌트: Kotlin/JVM
호환되지 않는 변경 유형: 동작
요약: Kotlin은 의미론적으로 해당 타입으로의 다운캐스트만 필요한 경우 숫자 값을 프리미티브 숫자 타입으로 자동으로 변환하는 것을 방지합니다.
지원 중단 주기:
- < 1.5.30: 영향을 받는 모든 사례에서 이전 동작 유지
- 1.5.30: 생성된 프로퍼티 위임 접근자(property delegate accessors)에서의 다운캐스트 동작 수정,
-Xuse-old-backend를 사용하여 일시적으로 1.5.30 수정 이전의 동작으로 되돌릴 수 있음- >= 1.6.20: 영향을 받는 다른 사례에서의 다운캐스트 동작 수정
JLS를 위반하는 컨테이너 어노테이션을 가진 반복 가능한 어노테이션 클래스 선언 금지
이슈: KT-47928
컴포넌트: Kotlin/JVM
호환되지 않는 변경 유형: 소스
요약: Kotlin 1.6은 반복 가능한(repeatable) 어노테이션의 컨테이너 어노테이션이 JLS 9.6.3과 동일한 요구 사항(배열 타입 값 메서드, 유지 정책(retention), 타겟)을 충족하는지 확인합니다.
지원 중단 주기:
- 1.5.30: JLS 요구 사항을 위반하는 반복 가능한 컨테이너 어노테이션 선언에 대해 경고 도입 (progressive 모드에서는 오류)
- 1.6.0: 이 경고를 오류로 격상,
-XXLanguage:-RepeatableAnnotationContainerConstraints를 사용하여 일시적으로 오류 보고를 비활성화할 수 있음
반복 가능한 어노테이션 클래스 내부에 Container라는 이름의 중첩 클래스 선언 금지
이슈: KT-47971
컴포넌트: Kotlin/JVM
호환되지 않는 변경 유형: 소스
요약: Kotlin 1.6은 Kotlin에서 선언된 반복 가능한 어노테이션이
Container라는 미리 정의된 이름을 가진 중첩 클래스를 가지지 않는지 확인합니다.지원 중단 주기:
- 1.5.30: Kotlin의 반복 가능한 어노테이션 클래스 내에 이름이
Container인 중첩 클래스가 있는 경우 경고 도입 (progressive 모드에서는 오류)- 1.6.0: 이 경고를 오류로 격상,
-XXLanguage:-RepeatableAnnotationContainerConstraints를 사용하여 일시적으로 오류 보고를 비활성화할 수 있음
인터페이스 프로퍼티를 오버라이드하는 주 생성자의 프로퍼티에 @JvmField 사용 금지
이슈: KT-32753
컴포넌트: Kotlin/JVM
호환되지 않는 변경 유형: 소스
요약: Kotlin 1.6은 인터페이스 프로퍼티를 오버라이드하는 주 생성자에 선언된 프로퍼티에
@JvmField어노테이션을 사용하는 것을 금지합니다.지원 중단 주기:
- 1.5.20: 주 생성자의 이러한 프로퍼티에
@JvmField어노테이션이 있는 경우 경고 도입- 1.6.0: 이 경고를 오류로 격상,
-XXLanguage:-ProhibitJvmFieldOnOverrideFromInterfaceInPrimaryConstructor를 사용하여 일시적으로 오류 보고를 비활성화할 수 있음
컴파일러 옵션 -Xjvm-default의 enable 및 compatibility 모드 지원 중단
이슈: KT-46329
컴포넌트: Kotlin/JVM
호환되지 않는 변경 유형: 소스
요약: Kotlin 1.6.20은
-Xjvm-default컴파일러 옵션의enable및compatibility모드 사용에 대해 경고합니다.지원 중단 주기:
- 1.6.20:
-Xjvm-default컴파일러 옵션의enable및compatibility모드에 대해 경고 도입- >= 1.8.0: 이 경고를 오류로 격상
public-abi 인라인 함수에서 super 호출 금지
이슈: KT-45379
컴포넌트: 코어 언어
호환되지 않는 변경 유형: 소스
요약: Kotlin 1.6은 public 또는 protected 인라인 함수 및 프로퍼티에서
super한정자를 사용하여 함수를 호출하는 것을 금지합니다.지원 중단 주기:
- 1.5.0: public 또는 protected 인라인 함수나 프로퍼티 접근자에서 super 호출을 하는 경우 경고 도입
- 1.6.0: 이 경고를 오류로 격상,
-XXLanguage:-ProhibitSuperCallsFromPublicInline를 사용하여 일시적으로 오류 보고를 비활성화할 수 있음
public 인라인 함수에서 protected 생성자 호출 금지
이슈: KT-48860
컴포넌트: 코어 언어
호환되지 않는 변경 유형: 소스
요약: Kotlin 1.6은 public 또는 protected 인라인 함수 및 프로퍼티에서 protected 생성자를 호출하는 것을 금지합니다.
지원 중단 주기:
- 1.4.30: public 또는 protected 인라인 함수나 프로퍼티 접근자에서 protected 생성자를 호출하는 경우 경고 도입
- 1.6.0: 이 경고를 오류로 격상,
-XXLanguage:-ProhibitProtectedConstructorCallFromPublicInline를 사용하여 일시적으로 오류 보고를 비활성화할 수 있음
private-in-file 타입에서 private 중첩 타입 노출 금지
이슈: KT-20094
컴포넌트: 코어 언어
호환되지 않는 변경 유형: 소스
요약: Kotlin 1.6은 private-in-file 타입에서 private 중첩 타입 및 내부 클래스를 노출하는 것을 금지합니다.
지원 중단 주기:
- 1.5.0: private-in-file 타입에서 노출되는 private 타입에 대해 경고 도입
- 1.6.0: 이 경고를 오류로 격상,
-XXLanguage:-PrivateInFileEffectiveVisibility를 사용하여 일시적으로 오류 보고를 비활성화할 수 있음
타입에 대한 어노테이션에서 어노테이션 타겟이 분석되지 않는 여러 경우
이슈: KT-28449
컴포넌트: 코어 언어
호환되지 않는 변경 유형: 소스
요약: Kotlin 1.6은 타입에 적용될 수 없는 어노테이션을 타입에 사용하는 것을 더 이상 허용하지 않습니다.
지원 중단 주기:
- 1.5.20: progressive 모드에서 오류 도입
- 1.6.0: 오류 도입,
-XXLanguage:-ProperCheckAnnotationsTargetInTypeUsePositions를 사용하여 일시적으로 오류 보고를 비활성화할 수 있음
후행 람다와 함께 suspend라는 이름의 함수 호출 금지
이슈: KT-22562
컴포넌트: 코어 언어
호환되지 않는 변경 유형: 소스
요약: Kotlin 1.6은 함수형 타입의 단일 인자가 후행 람다로 전달되는
suspend라는 이름의 함수 호출을 더 이상 허용하지 않습니다.지원 중단 주기:
- 1.3.0: 해당 함수 호출에 대해 경고 도입
- 1.6.0: 이 경고를 오류로 격상
- >= 1.7.0:
{앞의suspend가 키워드로 파싱되도록 언어 문법 변경 도입
표준 라이브러리 (Standard library)
minus/removeAll/retainAll에서 취약한 contains 최적화 제거
이슈: KT-45438
컴포넌트: kotlin-stdlib
호환되지 않는 변경 유형: 동작
요약: Kotlin 1.6은 컬렉션/iterable/배열/시퀀스에서 여러 요소를 제거하는 함수 및 연산자의 인자에 대해 더 이상 set으로의 변환을 수행하지 않습니다.
지원 중단 주기:
- < 1.6: 이전 동작: 일부 경우에 인자가 set으로 변환됨
- 1.6.0: 함수 인자가 컬렉션인 경우 더 이상
Set으로 변환되지 않습니다. 컬렉션이 아닌 경우 대신List로 변환될 수 있습니다. JVM에서 시스템 속성kotlin.collections.convert_arg_to_set_in_removeAll=true를 설정하여 이전 동작으로 일시적으로 되돌릴 수 있습니다.- >= 1.7: 위의 시스템 속성은 더 이상 효과가 없습니다.
Random.nextLong의 값 생성 알고리즘 변경
이슈: KT-47304
컴포넌트: kotlin-stdlib
호환되지 않는 변경 유형: 동작
요약: Kotlin 1.6은 지정된 범위를 벗어나는 값이 생성되는 것을 방지하기 위해
Random.nextLong함수의 값 생성 알고리즘을 변경합니다.지원 중단 주기:
- 1.6.0: 동작이 즉시 수정됨
컬렉션 min 및 max 함수의 반환 타입을 점진적으로 non-nullable로 변경
이슈: KT-38854
컴포넌트: kotlin-stdlib
호환되지 않는 변경 유형: 소스
요약: 컬렉션
min및max함수의 반환 타입이 Kotlin 1.7에서 non-nullable로 변경됩니다.지원 중단 주기:
- 1.4.0: 동의어로
...OrNull함수를 도입하고 영향을 받는 API를 지원 중단 (이슈의 세부 정보 참조)- 1.5.0: 영향을 받는 API의 지원 중단 수준을 오류로 격상
- 1.6.0: 공용 API에서 지원 중단된 함수를 숨김
- >= 1.7: 반환 타입을 non-nullable로 하여 영향을 받는 API를 재도입
부동 소수점 배열 함수 지원 중단: contains, indexOf, lastIndexOf
이슈: KT-28753
컴포넌트: kotlin-stdlib
호환되지 않는 변경 유형: 소스
요약: Kotlin은 총 순서(total order) 대신 IEEE-754 순서를 사용하여 값을 비교하는 부동 소수점 배열 함수
contains,indexOf,lastIndexOf를 지원 중단합니다.지원 중단 주기:
- 1.4.0: 해당 함수들을 경고와 함께 지원 중단
- 1.6.0: 지원 중단 수준을 오류로 격상
- >= 1.7: 공용 API에서 지원 중단된 함수를 숨김
kotlin.dom 및 kotlin.browser 패키지의 선언을 kotlinx.*로 마이그레이션
이슈: KT-39330
컴포넌트: kotlin-stdlib (JS)
호환되지 않는 변경 유형: 소스
요약:
kotlin.dom및kotlin.browser패키지의 선언들이 stdlib에서 추출될 준비를 위해 해당kotlinx.*패키지로 이동됩니다.지원 중단 주기:
- 1.4.0:
kotlinx.dom및kotlinx.browser패키지에 대체 API 도입- 1.4.0:
kotlin.dom및kotlin.browser패키지의 API를 지원 중단하고 위의 새 API를 대체제로 제안- 1.6.0: 지원 중단 수준을 오류로 격상
- >= 1.7: stdlib에서 지원 중단된 함수 제거
- >= 1.7: kotlinx.* 패키지의 API를 별도의 라이브러리로 이동
Kotlin/JS에서 Regex.replace 함수를 인라인이 아니게 변경
이슈: KT-27738
컴포넌트: kotlin-stdlib (JS)
호환되지 않는 변경 유형: 소스
요약: 함수형
transform파라미터를 가진Regex.replace함수는 Kotlin/JS에서 더 이상 인라인(inline)이 아니게 됩니다.지원 중단 주기:
- 1.6.0: 해당 함수에서
inline한정자 제거
대체 문자열에 그룹 참조가 포함된 경우 JVM과 JS에서 Regex.replace 함수의 동작 차이
이슈: KT-28378
컴포넌트: kotlin-stdlib (JS)
호환되지 않는 변경 유형: 동작
요약: Kotlin/JS의 대체 패턴 문자열을 사용하는
Regex.replace함수는 Kotlin/JVM에서와 동일한 패턴 문법을 따르게 됩니다.지원 중단 주기:
- 1.6.0: Kotlin/JS stdlib의
Regex.replace에서 대체 패턴 처리 방식 변경
JS Regex에서 유니코드 케이스 폴딩 사용
이슈: KT-45928
컴포넌트: kotlin-stdlib (JS)
호환되지 않는 변경 유형: 동작
요약: Kotlin/JS의
Regex클래스는 유니코드 규칙에 따라 문자를 검색하고 비교하기 위해 기본 JS 정규식 엔진을 호출할 때unicode플래그를 사용합니다. 이로 인해 JS 환경의 특정 버전 요구 사항이 생기며, 정규식 패턴 문자열에서 불필요한 이스케이프에 대해 더 엄격한 유효성 검사가 발생합니다.지원 중단 주기:
- 1.5.0: JS
Regex클래스의 대부분의 함수에서 유니코드 케이스 폴딩 활성화- 1.6.0:
Regex.replaceFirst함수에서 유니코드 케이스 폴딩 활성화
일부 JS 전용 API 지원 중단
이슈: KT-48587
컴포넌트: kotlin-stdlib (JS)
호환되지 않는 변경 유형: 소스
요약: stdlib의 다수 JS 전용 함수가 제거를 위해 지원 중단됩니다. 여기에는
String.concat(String),String.match(regex: String),String.matches(regex: String), 그리고 비교 함수를 받는 배열의sort함수들(예:Array<out T>.sort(comparison: (a: T, b: T) -> Int))이 포함됩니다.지원 중단 주기:
- 1.6.0: 해당 함수들을 경고와 함께 지원 중단
- 1.7.0: 지원 중단 수준을 오류로 격상
- 1.8.0: 공용 API에서 지원 중단된 함수 제거
Kotlin/JS 클래스의 공용 API에서 구현 및 상호 운용성 관련 함수 숨기기
이슈: KT-48587
컴포넌트: kotlin-stdlib (JS)
호환되지 않는 변경 유형: 소스, 바이너리
요약:
HashMap.createEntrySet및AbstactMutableCollection.toJSON함수의 가시성이 internal로 변경됩니다.지원 중단 주기:
- 1.6.0: 함수를 internal로 변경하여 공용 API에서 제거
도구 (Tools)
KotlinGradleSubplugin 클래스 지원 중단
이슈: KT-48830
컴포넌트: Gradle
호환되지 않는 변경 유형: 소스
요약:
KotlinGradleSubplugin클래스가KotlinCompilerPluginSupportPlugin을 위해 지원 중단됩니다.지원 중단 주기:
- 1.6.0: 지원 중단 수준을 오류로 격상
- >= 1.7.0: 지원 중단된 클래스 제거
kotlin.useFallbackCompilerSearch 빌드 옵션 제거
이슈: KT-46719
컴포넌트: Gradle
호환되지 않는 변경 유형: 소스
요약: 지원 중단된 'kotlin.useFallbackCompilerSearch' 빌드 옵션을 제거합니다.
지원 중단 주기:
- 1.5.0: 지원 중단 수준을 경고로 격상
- 1.6.0: 지원 중단된 옵션 제거
여러 컴파일러 옵션 제거
이슈: KT-48847
컴포넌트: Gradle
호환되지 않는 변경 유형: 소스
요약: 지원 중단된
noReflect및includeRuntime컴파일러 옵션을 제거합니다.지원 중단 주기:
- 1.5.0: 지원 중단 수준을 오류로 격상
- 1.6.0: 지원 중단된 옵션 제거
useIR 컴파일러 옵션 지원 중단
이슈: KT-48847
컴포넌트: Gradle
호환되지 않는 변경 유형: 소스
요약: 지원 중단된
useIR컴파일러 옵션을 숨깁니다.지원 중단 주기:
- 1.5.0: 지원 중단 수준을 경고로 격상
- 1.6.0: 옵션을 숨김
- >= 1.7.0: 지원 중단된 옵션 제거
kapt.use.worker.api Gradle 속성 지원 중단
이슈: KT-48826
컴포넌트: Gradle
호환되지 않는 변경 유형: 소스
요약: Gradle Workers API를 통해 kapt를 실행할 수 있게 했던
kapt.use.worker.api속성을 지원 중단합니다. (기본값: true)지원 중단 주기:
- 1.6.20: 지원 중단 수준을 경고로 격상
- >= 1.8.0: 이 속성 제거
kotlin.parallel.tasks.in.project Gradle 속성 제거
이슈: KT-46406
컴포넌트: Gradle
호환되지 않는 변경 유형: 소스
요약:
kotlin.parallel.tasks.in.project속성을 제거합니다.지원 중단 주기:
- 1.5.20: 지원 중단 수준을 경고로 격상
- 1.6.20: 이 속성 제거
kotlin.experimental.coroutines Gradle DSL 옵션 및 kotlin.coroutines Gradle 속성 지원 중단
이슈: KT-50369
컴포넌트: Gradle
호환되지 않는 변경 유형: 소스
요약:
kotlin.experimental.coroutinesGradle DSL 옵션 및kotlin.coroutines속성을 지원 중단합니다.지원 중단 주기:
- 1.6.20: 지원 중단 수준을 경고로 격상
- >= 1.7.0: DSL 옵션 및 속성 제거
