Kotlin 1.6.x 호환성 가이드

Kotlin 1.6.x 호환성 가이드

Keep the Language ModernComfortable Updates는 Kotlin 언어 설계의 기본 원칙 두 가지예요. 전자는 언어 진화를 막는 구조는 제거해야 한다는 뜻이고, 후자는 그런 제거를 미리 잘 알려서 코드 마이그레이션을 최대한 매끄럽게 해야 한다는 뜻이에요.

대부분의 언어 변경은 이미 업데이트 변경 로그나 컴파일러 경고 같은 다른 채널을 통해 안내됐지만, 이 문서는 그 변경들을 한자리에 모아서 Kotlin 1.5에서 1.6으로 마이그레이션할 때 참고할 수 있는 완전한 레퍼런스를 제공해요.

출처: Kotlin 문서 — Compatibility guide for Kotlin 1.6.x

본문

기본 용어

이 문서에서는 몇 가지 종류의 호환성을 다뤄요.

  • source(소스): 소스 비호환 변경은 예전에는 (경고나 오류 없이) 잘 컴파일되던 코드가 더 이상 컴파일되지 않게 만드는 변경이에요.
  • binary(바이너리): 두 바이너리 아티팩트를 서로 바꿔 써도 로딩이나 링크 오류가 나지 않으면 바이너리 호환이라고 불러요.
  • behavioral(동작): 같은 프로그램이 변경 적용 전후에 다르게 동작한다면 동작 비호환 변경이라고 해요.

이 정의는 순수 Kotlin에만 해당한다는 점 기억해 두세요. 다른 언어(예를 들어 Java) 관점에서 본 Kotlin 코드의 호환성은 이 문서의 범위 밖이에요.

언어

enum, sealed, Boolean subject를 가진 when 문을 기본적으로 완전하게 만들기

Issue: KT-47709

Component: Core language

Incompatible change type: source

Short summary: Kotlin 1.6은 enum, sealed, Boolean subject를 가진 when 문이 완전하지 않으면 경고를 내요.

Deprecation cycle:

  • 1.6.0: enum, sealed, Boolean subject를 가진 when 문이 완전하지 않으면 경고를 내요(progressive 모드에서는 오류).
  • 1.7.0: 이 경고를 오류로 올려요.

when-with-subject의 혼란스러운 문법 deprecated 처리

Issue: KT-48385

Component: Core language

Incompatible change type: source

Short summary: Kotlin 1.6은 when 조건식에서 헷갈리기 쉬운 몇 가지 문법 구성을 deprecated 처리해요.

Deprecation cycle:

  • 1.6.20: 영향받는 표현식에 deprecation 경고를 내요.
  • 1.8.0: 이 경고를 오류로 올려요.
  • = 1.8: 일부 deprecated 구성은 새 언어 기능에 재사용해요.

companion과 중첩 객체의 super 생성자 호출에서 클래스 멤버 접근 금지

Issue: KT-25289

Component: Core language

Incompatible change type: source

Short summary: Kotlin 1.6은 companion 및 일반 객체의 super 생성자 호출 인자에서 리시버가 해당 선언을 가리키면 오류를 보고해요.

Deprecation cycle:

  • 1.5.20: 문제가 되는 인자에 대해 경고를 내요.
  • 1.6.0: 이 경고를 오류로 올려요. -XXLanguage:-ProhibitSelfCallsInNestedObjects을 쓰면 1.6 이전 동작으로 임시로 되돌릴 수 있어요.

타입 nullability 강화 개선

Issue: KT-48623

Component: Kotlin/JVM

Incompatible change type: source

Short summary: Kotlin 1.7은 Java 코드의 타입 nullability 어노테이션을 로드하고 해석하는 방식을 바꿔요.

Deprecation cycle:

  • 1.4.30: 더 정밀한 타입 nullability가 오류를 일으킬 수 있는 경우에 대해 경고를 내요.
  • 1.7.0: Java 타입의 더 정밀한 nullability를 추론해요. -XXLanguage:-TypeEnhancementImprovementsInStrictMode을 쓰면 1.7 이전 동작으로 임시로 되돌릴 수 있어요.

서로 다른 숫자 타입 간의 암시적 강제 변환 방지

Issue: KT-48645

Component: Kotlin/JVM

Incompatible change type: behavioral

Short summary: Kotlin은 의미상 그 타입으로의 다운캐스트만 필요했던 곳에서 숫자 값을 원시 숫자 타입으로 자동 변환하는 것을 피해요.

Deprecation cycle:

  • < 1.5.30: 모든 영향받는 경우에서 예전 동작.
  • 1.5.30: 생성된 프로퍼티 위임 접근자에서 다운캐스트 동작을 수정해요. -Xuse-old-backend을 쓰면 1.5.30 수정 이전 동작으로 임시로 되돌릴 수 있어요.
  • = 1.6.20: 다른 영향받는 경우에서 다운캐스트 동작을 수정해요.

컨테이너 어노테이션이 JLS를 위반하는 반복 가능한 어노테이션 클래스 선언 금지

Issue: KT-47928

Component: Kotlin/JVM

Incompatible change type: source

Short summary: Kotlin 1.6은 반복 가능한 어노테이션의 컨테이너 어노테이션이 JLS 9.6.3과 같은 요구사항(배열 타입의 value 메서드, retention, target)을 충족하는지 확인해요.

Deprecation cycle:

  • 1.5.30: JLS 요구사항을 위반하는 반복 가능한 컨테이너 어노테이션 선언에 대해 경고를 내요(progressive 모드에서는 오류).
  • 1.6.0: 이 경고를 오류로 올려요. -XXLanguage:-RepeatableAnnotationContainerConstraints을 쓰면 오류 보고를 임시로 끌 수 있어요.

반복 가능한 어노테이션 클래스에 Container라는 이름의 중첩 클래스 선언 금지

Issue: KT-47971

Component: Kotlin/JVM

Incompatible change type: source

Short summary: Kotlin 1.6은 Kotlin에서 선언한 반복 가능한 어노테이션에 미리 정해진 이름 Container의 중첩 클래스가 없는지 확인해요.

Deprecation cycle:

  • 1.5.30: Kotlin 반복 가능한 어노테이션 클래스에서 Container라는 이름의 중첩 클래스에 대해 경고를 내요(progressive 모드에서는 오류).
  • 1.6.0: 이 경고를 오류로 올려요. -XXLanguage:-RepeatableAnnotationContainerConstraints을 쓰면 오류 보고를 임시로 끌 수 있어요.

인터페이스 프로퍼티를 오버라이드하는 기본 생성자의 프로퍼티에 @JvmField 금지

Issue: KT-32753

Component: Kotlin/JVM

Incompatible change type: source

Short summary: Kotlin 1.6부터 인터페이스 프로퍼티를 오버라이드하는, 기본 생성자에 선언된 프로퍼티에 @JvmField 어노테이션을 달 수 없게 돼요.

Deprecation cycle:

  • 1.5.20: 기본 생성자의 그런 프로퍼티에 달린 @JvmField 어노테이션에 대해 경고를 내요.
  • 1.6.0: 이 경고를 오류로 올려요. -XXLanguage:-ProhibitJvmFieldOnOverrideFromInterfaceInPrimaryConstructor을 쓰면 오류 보고를 임시로 끌 수 있어요.

컴파일러 옵션 -Xjvm-default의 enable 및 compatibility 모드 deprecated 처리

Issue: KT-46329

Component: Kotlin/JVM

Incompatible change type: source

Short summary: Kotlin 1.6.20은 -Xjvm-default 컴파일러 옵션의 enablecompatibility 모드 사용에 대해 경고를 내요.

Deprecation cycle:

  • 1.6.20: -Xjvm-default 컴파일러 옵션의 enablecompatibility 모드에 대해 경고를 내요.
  • = 1.8.0: 이 경고를 오류로 올려요.

public ABI inline 함수에서 super 호출 금지

Issue: KT-45379

Component: Core language

Incompatible change type: source

Short summary: Kotlin 1.6부터 public 또는 protected inline 함수와 프로퍼티에서 super 한정자가 붙은 함수를 호출할 수 없게 돼요.

Deprecation cycle:

  • 1.5.0: public 또는 protected inline 함수나 프로퍼티 접근자의 super 호출에 대해 경고를 내요.
  • 1.6.0: 이 경고를 오류로 올려요. -XXLanguage:-ProhibitSuperCallsFromPublicInline을 쓰면 오류 보고를 임시로 끌 수 있어요.

public inline 함수에서 protected 생성자 호출 금지

Issue: KT-48860

Component: Core language

Incompatible change type: source

Short summary: Kotlin 1.6부터 public 또는 protected inline 함수와 프로퍼티에서 protected 생성자를 호출할 수 없게 돼요.

Deprecation cycle:

  • 1.4.30: public 또는 protected inline 함수나 프로퍼티 접근자의 protected 생성자 호출에 대해 경고를 내요.
  • 1.6.0: 이 경고를 오류로 올려요. -XXLanguage:-ProhibitProtectedConstructorCallFromPublicInline을 쓰면 오류 보고를 임시로 끌 수 있어요.

private-in-file 타입에서 private 중첩 타입 노출 금지

Issue: KT-20094

Component: Core language

Incompatible change type: source

Short summary: Kotlin 1.6부터 private-in-file 타입에서 private 중첩 타입과 내부 클래스를 노출할 수 없게 돼요.

Deprecation cycle:

  • 1.5.0: private-in-file 타입에서 노출되는 private 타입에 대해 경고를 내요.
  • 1.6.0: 이 경고를 오류로 올려요. -XXLanguage:-PrivateInFileEffectiveVisibility을 쓰면 오류 보고를 임시로 끌 수 있어요.

타입에 대한 어노테이션의 어노테이션 대상이 여러 경우에서 분석되지 않음

Issue: KT-28449

Component: Core language

Incompatible change type: source

Short summary: Kotlin 1.6부터는 타입에 적용되면 안 되는 어노테이션을 타입에 더 이상 허용하지 않아요.

Deprecation cycle:

  • 1.5.20: progressive 모드에서 오류를 내요.
  • 1.6.0: 오류를 내요. -XXLanguage:-ProperCheckAnnotationsTargetInTypeUsePositions을 쓰면 오류 보고를 임시로 끌 수 있어요.

이름이 suspend인 함수를 trailing lambda와 함께 호출하는 것 금지

Issue: KT-22562

Component: Core language

Incompatible change type: source

Short summary: Kotlin 1.6부터는 단일 인자로 함수 타입을 갖는 suspend라는 이름의 함수를 trailing lambda로 호출할 수 없게 돼요.

Deprecation cycle:

  • 1.3.0: 그런 함수 호출에 대해 경고를 내요.
  • 1.6.0: 이 경고를 오류로 올려요.
  • = 1.7.0: 언어 문법을 변경해서 { 앞의 suspend가 키워드로 파싱되도록 해요.

표준 라이브러리

minus/removeAll/retainAll에서 취약한 contains 최적화 제거

Issue: KT-45438

Component: kotlin-stdlib

Incompatible change type: behavioral

Short summary: Kotlin 1.6부터 컬렉션/이터러블/배열/시퀀스에서 여러 요소를 제거하는 함수와 연산자의 인자를 set으로 변환하지 않아요.

Deprecation cycle:

  • < 1.6: 예전 동작 — 일부 경우에 인자를 set으로 변환했어요.
  • 1.6.0: 함수 인자가 컬렉션이면 더 이상 Set으로 변환하지 않아요. 컬렉션이 아니면 대신 List로 변환할 수 있어요. JVM에서는 kotlin.collections.convert_arg_to_set_in_removeAll=true 시스템 속성을 설정하면 예전 동작을 임시로 되돌릴 수 있어요.
  • = 1.7: 위 시스템 속성은 더 이상 효과가 없어요.

Random.nextLong의 값 생성 알고리즘 변경

Issue: KT-47304

Component: kotlin-stdlib

Incompatible change type: behavioral

Short summary: Kotlin 1.6은 지정된 범위를 벗어나는 값을 만들지 않도록 Random.nextLong 함수의 값 생성 알고리즘을 변경해요.

Deprecation cycle:

  • 1.6.0: 동작을 즉시 수정해요.

컬렉션 min/max 함수의 반환 타입을 점진적으로 non-nullable로 변경

Issue: KT-38854

Component: kotlin-stdlib

Incompatible change type: source

Short summary: 컬렉션 minmax 함수의 반환 타입이 Kotlin 1.7에서 non-nullable로 바뀔 예정이에요.

Deprecation cycle:

  • 1.4.0: 동의어로 ...OrNull 함수를 도입하고 영향받는 API를 deprecated 처리해요(자세한 내용은 이슈 참고).
  • 1.5.0: 영향받는 API의 deprecation 수준을 오류로 올려요.
  • 1.6.0: deprecated 함수를 공개 API에서 숨겨요.
  • = 1.7: 영향받는 API를 non-nullable 반환 타입으로 다시 도입해요.

부동소수점 배열 함수 deprecated 처리: contains, indexOf, lastIndexOf

Issue: KT-28753

Component: kotlin-stdlib

Incompatible change type: source

Short summary: Kotlin은 전체 순서(total order) 대신 IEEE-754 순서로 값을 비교하는 부동소수점 배열 함수 contains, indexOf, lastIndexOf를 deprecated 처리해요.

Deprecation cycle:

  • 1.4.0: 영향받는 함수를 경고와 함께 deprecated 처리해요.
  • 1.6.0: deprecation 수준을 오류로 올려요.
  • = 1.7: deprecated 함수를 공개 API에서 숨겨요.

kotlin.dom과 kotlin.browser 패키지의 선언을 kotlinx.*로 마이그레이션

Issue: KT-39330

Component: kotlin-stdlib (JS)

Incompatible change type: source

Short summary: kotlin.domkotlin.browser 패키지의 선언이 stdlib에서 분리될 준비로 대응하는 kotlinx.* 패키지로 이동돼요.

Deprecation cycle:

  • 1.4.0: kotlinx.domkotlinx.browser 패키지에 대체 API를 도입해요.
  • 1.4.0: kotlin.domkotlin.browser 패키지의 API를 deprecated 처리하고 위 새 API를 대체 방안으로 제안해요.
  • 1.6.0: deprecation 수준을 오류로 올려요.
  • = 1.7: deprecated 함수를 stdlib에서 제거해요.

  • = 1.7: kotlinx.* 패키지의 API를 별도 라이브러리로 옮겨요.

Kotlin/JS에서 Regex.replace 함수를 inline으로 유지하지 않기

Issue: KT-27738

Component: kotlin-stdlib (JS)

Incompatible change type: source

Short summary: 함수형 transform 파라미터를 가진 Regex.replace 함수가 Kotlin/JS에서 더 이상 inline이 아니게 돼요.

Deprecation cycle:

  • 1.6.0: 영향받는 함수에서 inline 수정자를 제거해요.

대체 문자열에 그룹 참조가 있을 때 JVM과 JS에서 Regex.replace 함수의 서로 다른 동작

Issue: KT-28378

Component: kotlin-stdlib (JS)

Incompatible change type: behavioral

Short summary: Kotlin/JS의 Regex.replace 함수가 대체 패턴 문자열에서 Kotlin/JVM과 같은 패턴 문법을 따르게 돼요.

Deprecation cycle:

  • 1.6.0: Kotlin/JS stdlib의 Regex.replace에서 대체 패턴 처리 방식을 바꿔요.

JS Regex에서 유니코드 케이스 폴딩 사용

Issue: KT-45928

Component: kotlin-stdlib (JS)

Incompatible change type: behavioral

Short summary: Kotlin/JS의 Regex 클래스는 기본 JS 정규식 엔진을 호출할 때 unicode 플래그를 사용해서 문자를 유니코드 규칙에 따라 검색하고 비교하게 돼요. 이로 인해 JS 환경에 특정 버전 요구사항이 생기고, 정규식 패턴 문자열에서 불필요한 이스케이프에 대한 더 엄격한 검증이 적용돼요.

Deprecation cycle:

  • 1.5.0: JS Regex 클래스의 대부분 함수에서 유니코드 케이스 폴딩을 활성화해요.
  • 1.6.0: Regex.replaceFirst 함수에서 유니코드 케이스 폴딩을 활성화해요.

일부 JS 전용 API deprecated 처리

Issue: KT-48587

Component: kotlin-stdlib (JS)

Incompatible change type: source

Short summary: stdlib의 여러 JS 전용 함수가 제거를 목적으로 deprecated 처리돼요. 여기에는 String.concat(String), String.match(regex: String), String.matches(regex: String), 그리고 비교 함수를 받는 배열의 sort 함수(예: Array<out T>.sort(comparison: (a: T, b: T) -> Int))가 포함돼요.

Deprecation cycle:

  • 1.6.0: 영향받는 함수를 경고와 함께 deprecated 처리해요.
  • 1.7.0: deprecation 수준을 오류로 올려요.
  • 1.8.0: deprecated 함수를 공개 API에서 제거해요.

Kotlin/JS 클래스의 공개 API에서 구현·상호운용 전용 함수 숨기기

Issue: KT-48587

Component: kotlin-stdlib (JS)

Incompatible change type: source, binary

Short summary: HashMap.createEntrySetAbstactMutableCollection.toJSON 함수의 가시성이 internal로 바뀌어요.

Deprecation cycle:

  • 1.6.0: 함수를 internal로 만들어 공개 API에서 제거해요.

도구

KotlinGradleSubplugin 클래스 deprecated 처리

Issue: KT-48830

Component: Gradle

Incompatible change type: source

Short summary: KotlinGradleSubplugin 클래스가 KotlinCompilerPluginSupportPlugin을 대신 쓰도록 deprecated 처리돼요.

Deprecation cycle:

  • 1.6.0: deprecation 수준을 오류로 올려요.
  • = 1.7.0: deprecated 클래스를 제거해요.

kotlin.useFallbackCompilerSearch 빌드 옵션 제거

Issue: KT-46719

Component: Gradle

Incompatible change type: source

Short summary: deprecated 처리된 'kotlin.useFallbackCompilerSearch' 빌드 옵션을 제거해요.

Deprecation cycle:

  • 1.5.0: deprecation 수준을 경고로 올려요.
  • 1.6.0: deprecated 옵션을 제거해요.

여러 컴파일러 옵션 제거

Issue: KT-48847

Component: Gradle

Incompatible change type: source

Short summary: deprecated 처리된 noReflectincludeRuntime 컴파일러 옵션을 제거해요.

Deprecation cycle:

  • 1.5.0: deprecation 수준을 오류로 올려요.
  • 1.6.0: deprecated 옵션을 제거해요.

useIR 컴파일러 옵션 deprecated 처리

Issue: KT-48847

Component: Gradle

Incompatible change type: source

Short summary: deprecated 처리된 useIR 컴파일러 옵션을 숨겨요.

Deprecation cycle:

  • 1.5.0: deprecation 수준을 경고로 올려요.
  • 1.6.0: 옵션을 숨겨요.
  • = 1.7.0: deprecated 옵션을 제거해요.

kapt.use.worker.api Gradle 프로퍼티 deprecated 처리

Issue: KT-48826

Component: Gradle

Incompatible change type: source

Short summary: kapt를 Gradle Workers API로 실행할 수 있게 해주던 kapt.use.worker.api 프로퍼티(기본값: true)를 deprecated 처리해요.

Deprecation cycle:

  • 1.6.20: deprecation 수준을 경고로 올려요.
  • = 1.8.0: 이 프로퍼티를 제거해요.

kotlin.parallel.tasks.in.project Gradle 프로퍼티 제거

Issue: KT-46406

Component: Gradle

Incompatible change type: source

Short summary: kotlin.parallel.tasks.in.project 프로퍼티를 제거해요.

Deprecation cycle:

  • 1.5.20: deprecation 수준을 경고로 올려요.
  • 1.6.20: 이 프로퍼티를 제거해요.

kotlin.experimental.coroutines Gradle DSL 옵션과 kotlin.coroutines Gradle 프로퍼티 deprecated 처리

Issue: KT-50369

Component: Gradle

Incompatible change type: source

Short summary: kotlin.experimental.coroutines Gradle DSL 옵션과 kotlin.coroutines 프로퍼티를 deprecated 처리해요.

Deprecation cycle:

  • 1.6.20: deprecation 수준을 경고로 올려요.
  • = 1.7.0: DSL 옵션과 프로퍼티를 제거해요.

더 알아보기 (Learn more)