Kotlin 1.8.x 호환성 가이드

Kotlin 1.8.x 호환성 가이드

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

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

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

본문

기본 용어

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

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

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

언어

super 호출을 추상 상위클래스 멤버에 위임하는 것 금지

Issues: KT-45508, KT-49017, KT-38078

Component: Core language

Incompatible change type: source

Short summary: Kotlin은 명시적이거나 암시적인 super 호출이 상위클래스의 추상 멤버에 위임되면, 상위 인터페이스에 기본 구현이 있더라도 컴파일 오류를 보고해요.

Deprecation cycle:

  • 1.5.20: 모든 추상 멤버를 오버라이드하지 않는 비추상 클래스가 사용될 때 경고를 내요.
  • 1.7.0: super 호출이 실제로 상위클래스의 추상 멤버에 접근하면 경고를 보고해요.
  • 1.7.0: -Xjvm-default=all 또는 -Xjvm-default=all-compatibility 호환 모드가 활성화되면 영향받는 모든 경우에 오류를 보고하고, progressive 모드에서도 오류를 보고해요.
  • 1.8.0: 상위클래스의 오버라이드되지 않은 추상 메서드로 구체 클래스를 선언하는 경우와, Any의 메서드에 대한 super 호출이 상위클래스에서 추상으로 오버라이드된 경우에 오류를 보고해요.
  • 1.9.0: 상위클래스의 추상 메서드에 대한 명시적 super 호출을 포함해 영향받는 모든 경우에 오류를 보고해요.

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: 이 경고를 오류로 올려요. -XXLanguage:-ProhibitConfusingSyntaxInWhenBranches을 쓰면 1.8 이전 동작으로 임시로 되돌릴 수 있어요.
  • = 1.9: 일부 deprecated 구성은 새 언어 기능에 재사용해요.

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

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.9: 다른 영향받는 경우에서 다운캐스트 동작을 수정해요.

sealed 클래스의 private 생성자를 실제로 private으로 만들기

Issue: KT-44866

Component: Core language

Incompatible change type: source

Short summary: sealed 클래스의 상속자를 프로젝트 구조의 어디에 선언할 수 있는지에 대한 제한이 완화된 뒤, sealed 클래스 생성자의 기본 가시성이 protected가 됐어요. 하지만 1.8 이전까지 Kotlin은 여전히 명시적으로 private으로 선언된 sealed 클래스 생성자를 그 클래스 범위 밖에서 호출하는 것을 허용했어요.

Deprecation cycle:

  • 1.6.20: sealed 클래스의 private 생성자가 그 클래스 밖에서 호출되면 경고(또는 progressive 모드에서는 오류)를 보고해요.
  • 1.8.0: private 생성자에 기본 가시성 규칙을 적용해요(즉 private 생성자 호출은 해당 클래스 안에 있을 때만 해석할 수 있어요). -XXLanguage:-UseConsistentRulesForPrivateConstructorsOfSealedClasses 컴파일러 인자를 지정하면 예전 동작을 임시로 되돌릴 수 있어요.

빌더 추론 맥락에서 호환되지 않는 숫자 타입에 연산자 == 사용 금지

Issue: KT-45508

Component: Core language

Incompatible change type: source

Short summary: Kotlin 1.8은 빌더 추론 람다 함수 범위에서 호환되지 않는 숫자 타입(예: IntLong)에 연산자 ==를 쓰는 것을 다른 맥락에서 현재 금지하는 것과 같은 방식으로 금지해요.

Deprecation cycle:

  • 1.6.20: 호환되지 않는 숫자 타입에 연산자 ==가 사용되면 경고(또는 progressive 모드에서는 오류)를 보고해요.
  • 1.8.0: 경고를 오류로 올려요. -XXLanguage:-ProperEqualityChecksInBuilderInferenceCalls을 쓰면 1.8 이전 동작으로 임시로 되돌릴 수 있어요.

엘비스 연산자 오른쪽에서 else 없는 if와 완전하지 않은 when 금지

Issue: KT-44705

Component: Core language

Incompatible change type: source

Short summary: Kotlin 1.8은 엘비스 연산자(?:) 오른쪽에서 else 분기가 없는 if 식이나 완전하지 않은 when을 쓰는 것을 금지해요. 예전에는 엘비스 연산자의 결과가 식으로 사용되지 않으면 허용됐어요.

Deprecation cycle:

  • 1.6.20: 그런 완전하지 않은 if와 when 표현식에 대해 경고(또는 progressive 모드에서는 오류)를 보고해요.
  • 1.8.0: 이 경고를 오류로 올려요. -XXLanguage:-ProhibitNonExhaustiveIfInRhsOfElvis을 쓰면 1.8 이전 동작으로 임시로 되돌릴 수 있어요.

제네릭 타입 별칭 사용에서 상한 위반 금지 (별칭 타입의 여러 타입 인자에 하나의 타입 파라미터가 사용되는 경우)

Issues: KT-29168

Component: Core language

Incompatible change type: source

Short summary: Kotlin 1.8은 별칭 타입의 하나의 typealias 타입 파라미터가 여러 타입 인자에 사용되는 경우(예: typealias Alias<T> = Base<T, T>)에, 별칭 타입의 해당 타입 파라미터의 상한 제약을 위반하는 타입 인자를 가진 타입 별칭 사용을 금지해요.

Deprecation cycle:

  • 1.7.0: 별칭 타입의 해당 타입 파라미터의 상한 제약을 위반하는 타입 인자를 가진 타입 별칭 사용에 대해 경고(또는 progressive 모드에서는 오류)를 보고해요.
  • 1.8.0: 이 경고를 오류로 올려요. -XXLanguage:-ReportMissingUpperBoundsViolatedErrorOnAbbreviationAtSupertypes을 쓰면 1.8 이전 동작으로 임시로 되돌릴 수 있어요.

제네릭 타입 별칭 사용에서 상한 위반 금지 (별칭 타입의 타입 인자에 제네릭 타입 인자로 타입 파라미터가 사용되는 경우)

Issue: KT-54066

Component: Core language

Incompatible change type: source

Short summary: Kotlin은 별칭 타입의 타입 인자에 제네릭 타입 인자로 typealias 타입 파라미터가 사용되는 경우(예: typealias Alias<T> = Base<List<T>>)에, 별칭 타입의 해당 타입 파라미터의 상한 제약을 위반하는 타입 인자를 가진 타입 별칭 사용을 금지해요.

Deprecation cycle:

  • 1.8.0: 제네릭 typealias 사용이 별칭 타입의 해당 타입 파라미터의 상한 제약을 위반하는 타입 인자를 가지면 경고를 보고해요.
  • =1.10: 경고를 오류로 올려요.

위임 안에서 확장 프로퍼티에 대해 선언된 타입 파라미터 사용 금지

Issue: KT-24643

Component: Core language

Incompatible change type: source

Short summary: Kotlin 1.8은 제네릭 타입의 확장 프로퍼티를 리시버의 타입 파라미터를 안전하지 않은 방식으로 사용하는 제네릭 타입에 위임하는 것을 금지해요.

Deprecation cycle:

  • 1.6.0: 확장 프로퍼티를 위임된 프로퍼티의 타입 인자에서 추론된 타입 파라미터를 특정 방식으로 사용하는 타입에 위임하면 경고(또는 progressive 모드에서는 오류)를 보고해요.
  • 1.8.0: 경고를 오류로 올려요. -XXLanguage:-ForbidUsingExtensionPropertyTypeParameterInDelegate을 쓰면 1.8 이전 동작으로 임시로 되돌릴 수 있어요.

suspend 함수에 @Synchronized 어노테이션 금지

Issue: KT-48516

Component: Core language

Incompatible change type: source

Short summary: Kotlin 1.8은 synchronized 블록 안에서 suspending 호출이 일어나면 안 되므로 suspend 함수에 @Synchronized 어노테이션을 다는 것을 금지해요.

Deprecation cycle:

  • 1.6.0: @Synchronized 어노테이션이 달린 suspend 함수에 대해 경고를 보고해요. 이 경고는 progressive 모드에서는 오류로 보고돼요.
  • 1.8.0: 경고를 오류로 올려요. -XXLanguage:-SynchronizedSuspendError을 쓰면 1.8 이전 동작으로 임시로 되돌릴 수 있어요.

non-vararg 파라미터에 인자를 전달하는 데 스프레드 연산자 사용 금지

Issue: KT-48162

Component: Core language

Incompatible change type: source

Short summary: Kotlin은 특정 조건에서 스프레드 연산자(*)로 배열을 non-vararg 배열 파라미터에 전달하는 것을 허용했어요. Kotlin 1.8부터는 이것을 금지해요.

Deprecation cycle:

  • 1.6.0: non-vararg 배열 파라미터가 예상되는 곳에서 스프레드 연산자를 사용하면 경고(또는 progressive 모드에서는 오류)를 보고해요.
  • 1.8.0: 경고를 오류로 올려요. -XXLanguage:-ReportNonVarargSpreadOnGenericCalls을 쓰면 1.8 이전 동작으로 임시로 되돌릴 수 있어요.

람다의 반환 타입으로 오버로드된 함수에 전달된 람다에서 null 안전성 위반 금지

Issue: KT-49658

Component: Core language

Incompatible change type: source

Short summary: Kotlin 1.8은 람다의 반환 타입으로 오버로드된 함수에 전달된 람다가, 오버로드가 nullable 반환 타입을 허용하지 않을 때 그 람다에서 null을 반환하는 것을 금지해요. 예전에는 when 연산자의 한 분기에서 null이 반환될 때 허용됐어요.

Deprecation cycle:

  • 1.6.20: 타입 불일치 경고(또는 progressive 모드에서는 오류)를 보고해요.
  • 1.8.0: 경고를 오류로 올려요. -XXLanguage:-DontLoseDiagnosticsDuringOverloadResolutionByReturnType을 쓰면 1.8 이전 동작으로 임시로 되돌릴 수 있어요.

공개 시그니처에서 로컬 타입을 근사할 때 nullability 유지

Issue: KT-53982

Component: Core language

Incompatible change type: source, binary

Short summary: 반환 타입을 명시하지 않은 식 본문 함수에서 로컬 또는 익명 타입이 반환되면, Kotlin 컴파일러는 그 타입의 알려진 상위 타입을 사용해 반환 타입을 추론(또는 근사)해요. 이 과정에서 컴파일러가 실제로 null 값이 반환될 수 있는데 non-nullable 타입을 추론할 수 있었어요.

Deprecation cycle:

  • 1.8.0: flexible 타입을 flexible 상위 타입으로 근사해요.
  • 1.8.0: 선언이 nullable이어야 하는데 non-nullable 타입으로 추론되면 경고를 보고하고, 타입을 명시적으로 지정하도록 안내해요.
  • 1.9.0: nullable 타입을 nullable 상위 타입으로 근사해요. -XXLanguage:-KeepNullabilityWhenApproximatingLocalType을 쓰면 1.9 이전 동작으로 임시로 되돌릴 수 있어요.

오버라이드를 통해 deprecation 전파하지 않기

Issue: KT-47902

Component: Core language

Incompatible change type: source

Short summary: Kotlin 1.9부터는 상위클래스의 deprecated 멤버의 deprecation이 하위클래스의 그 오버라이드 멤버로 더 이상 전파되지 않아요. 이를 통해 상위클래스 멤버는 deprecated로 만들면서 하위클래스에서는 deprecated로 남겨 두지 않는 명시적 메커니즘을 제공해요.

Deprecation cycle:

  • 1.6.20: 향후 동작 변경 메시지와 함께, 이 경고를 억제하거나 deprecated 멤버의 오버라이드에 @Deprecated 어노테이션을 명시적으로 추가하라는 안내와 함께 경고를 보고해요.
  • 1.9.0: 오버라이드된 멤버로 deprecation 상태를 전파하는 것을 중단해요. 이 변경은 progressive 모드에서 즉시 적용되기도 해요.

빌더 추론 맥락에서 타입 변수를 상한으로 암시적으로 추론하는 것 금지

Issue: KT-47986

Component: Core language

Incompatible change type: source

Short summary: Kotlin 1.9는 빌더 추론 람다 함수 범위에서 사용 지점 타입 정보가 없을 때 타입 변수를 해당 타입 파라미터의 상한으로 추론하는 것을 다른 맥락에서 현재 금지하는 것과 같은 방식으로 금지해요.

Deprecation cycle:

  • 1.7.20: 사용 지점 타입 정보가 없는데 타입 파라미터가 선언된 상한으로 추론되면 경고(또는 progressive 모드에서는 오류)를 보고해요.
  • 1.9.0: 경고를 오류로 올려요. -XXLanguage:-ForbidInferringPostponedTypeVariableIntoDeclaredUpperBound을 쓰면 1.9 이전 동작으로 임시로 되돌릴 수 있어요.

어노테이션 클래스에서 파라미터 선언 외의 위치에 컬렉션 리터럴 사용 금지

Issue: KT-39041

Component: Core language

Incompatible change type: source

Short summary: Kotlin은 컬렉션 리터럴을 제한된 방식으로 사용할 수 있어요. 즉 어노테이션 클래스의 파라미터에 배열을 전달하거나 그 파라미터의 기본값을 지정하는 데 쓸 수 있어요. 하지만 그 외에도 Kotlin은 어노테이션 클래스 안의 다른 곳(예: 중첩 객체)에서 컬렉션 리터럴을 허용했어요. Kotlin 1.9는 어노테이션 클래스에서 파라미터의 기본값 외의 위치에 컬렉션 리터럴을 쓰는 것을 금지해요.

Deprecation cycle:

  • 1.7.0: 어노테이션 클래스의 중첩 객체에서 배열 리터럴을 사용하면 경고(또는 progressive 모드에서는 오류)를 보고해요.
  • 1.9.0: 경고를 오류로 올려요.

기본값 식에서 기본값을 가진 파라미터의 앞방향 참조 금지

Issue: KT-25694

Component: Core language

Incompatible change type: source

Short summary: Kotlin 1.9는 다른 파라미터의 기본값 식에서 기본값을 가진 파라미터를 앞방향으로 참조하는 것을 금지해요. 이렇게 하면 파라미터가 기본값 식에서 접근될 때쯤에는 그 파라미터에 함수로 전달된 값이나 자기 자신의 기본값 식으로 초기화된 값이 이미 있을 거라는 점이 보장돼요.

Deprecation cycle:

  • 1.7.0: 기본값을 가진 파라미터가 그보다 앞에 오는 다른 파라미터의 기본값에서 참조되면 경고(또는 progressive 모드에서는 오류)를 보고해요.
  • 1.9.0: 경고를 오류로 올려요. -XXLanguage:-ProhibitIllegalValueParameterUsageInDefaultArguments을 쓰면 1.9 이전 동작으로 임시로 되돌릴 수 있어요.

inline 함수형 파라미터에 대한 확장 호출 금지

Issue: KT-52502

Component: Core language

Incompatible change type: source

Short summary: Kotlin은 inline 함수형 파라미터를 리시버로 다른 inline 함수에 전달하는 것을 허용했지만, 그런 코드를 컴파일하면 항상 컴파일러 예외가 발생했어요. Kotlin 1.9는 이것을 금지해서 컴파일러가 중단되는 대신 오류를 보고하게 해요.

Deprecation cycle:

  • 1.7.20: inline 함수형 파라미터에 대한 inline 확장 호출에 대해 경고(또는 progressive 모드에서는 오류)를 보고해요.
  • 1.9.0: 경고를 오류로 올려요.

이름이 suspend인 infix 함수를 익명 함수 인자와 함께 호출하는 것 금지

Issue: KT-49264

Component: Core language

Incompatible change type: source

Short summary: Kotlin 1.9부터는 단일 인자로 함수 타입을 갖는 suspend라는 이름의 infix 함수를 익명 함수 리터럴로 전달해 호출할 수 없게 돼요.

Deprecation cycle:

  • 1.7.20: 익명 함수 리터럴과 함께 쓰이는 suspend infix 호출에 대해 경고를 보고해요.
  • 1.9.0: 경고를 오류로 올려요. -XXLanguage:-ModifierNonBuiltinSuspendFunError을 쓰면 1.9 이전 동작으로 임시로 되돌릴 수 있어요.
  • =1.10: 파서가 suspend fun 토큰 시퀀스를 해석하는 방식을 변경해요.

내부 클래스에서 캡처된 타입 파라미터를 가변성에 반하게 사용하는 것 금지

Issue: KT-50947

Component: Core language

Incompatible change type: source

Short summary: Kotlin 1.9는 in 또는 out 가변성을 가진 외부 클래스의 타입 파라미터를 그 클래스의 내부 클래스에서 그 타입 파라미터의 선언된 가변성을 위반하는 위치에 사용하는 것을 금지해요.

Deprecation cycle:

  • 1.7.0: 외부 클래스의 타입 파라미터 사용 위치가 그 파라미터의 가변성 규칙을 위반하면 경고(또는 progressive 모드에서는 오류)를 보고해요.
  • 1.9.0: 경고를 오류로 올려요. -XXLanguage:-ReportTypeVarianceConflictOnQualifierArguments을 쓰면 1.9 이전 동작으로 임시로 되돌릴 수 있어요.

복합 할당 연산자에서 명시적 반환 타입이 없는 함수의 재귀 호출 금지

Issue: KT-48546

Component: Core language

Incompatible change type: source

Short summary: Kotlin 1.9는 함수 본문 안의 복합 할당 연산자 인자에서 명시적 반환 타입이 지정되지 않은 함수를 호출하는 것을, 그 함수 본문 안의 다른 표현식에서 현재 금지하는 것과 같은 방식으로 금지해요.

Deprecation cycle:

  • 1.7.0: 명시적 반환 타입이 없는 함수가 그 함수 본문 안의 복합 할당 연산자 인자에서 재귀 호출되면 경고(또는 progressive 모드에서는 오류)를 보고해요.
  • 1.9.0: 경고를 오류로 올려요.

@NotNull T가 예상되는 곳에 nullable 바운드의 Kotlin 제네릭 파라미터를 넘기는 안전하지 않은 호출 금지

Issue: KT-36770

Component: Kotlin/JVM

Incompatible change type: source

Short summary: Kotlin 1.9는 Java 메서드의 @NotNull으로 주석이 달린 파라미터에 잠재적으로 nullable인 제네릭 타입 값을 전달하는 메서드 호출을 금지해요.

Deprecation cycle:

  • 1.5.20: non-nullable 타입이 예상되는 곳에 제약이 없는 제네릭 타입 파라미터가 전달되면 경고를 보고해요.
  • 1.9.0: 위 경고 대신 타입 불일치 오류를 보고해요. -XXLanguage:-ProhibitUsingNullableTypeParameterAgainstNotNullAnnotated을 쓰면 1.8 이전 동작으로 임시로 되돌릴 수 있어요.

enum 클래스의 entry 초기화에서 그 enum의 companion 멤버 접근 금지

Issue: KT-49110

Component: Core language

Incompatible change type: source

Short summary: Kotlin 1.9는 enum entry 초기화에서 enum의 companion 객체에 대한 모든 종류의 접근을 금지해요.

Deprecation cycle:

  • 1.6.20: 그런 companion 멤버 접근에 대해 경고(또는 progressive 모드에서는 오류)를 보고해요.
  • 1.9.0: 경고를 오류로 올려요. -XXLanguage:-ProhibitAccessToEnumCompanionMembersInEnumConstructorCall을 쓰면 1.8 이전 동작으로 임시로 되돌릴 수 있어요.

Enum.declaringClass 합성 프로퍼티 deprecated 처리 및 제거

Issue: KT-49653

Component: Kotlin/JVM

Incompatible change type: source

Short summary: Kotlin은 기본 Java 클래스 java.lang.EnumgetDeclaringClass() 메서드에서 만들어진 Enum 값에 합성 프로퍼티 declaringClass를 사용하는 것을 허용했는데, 이 메서드는 Kotlin Enum 타입에는 없어요. Kotlin 1.9는 이 프로퍼티 사용을 금지하고 확장 프로퍼티 declaringJavaClass로 마이그레이션할 것을 제안해요.

Deprecation cycle:

  • 1.7.0: declaringClass 프로퍼티 사용에 대해 경고(또는 progressive 모드에서는 오류)를 보고하고 declaringJavaClass 확장으로의 마이그레이션을 제안해요.
  • 1.9.0: 경고를 오류로 올려요. -XXLanguage:-ProhibitEnumDeclaringClass을 쓰면 1.9 이전 동작으로 임시로 되돌릴 수 있어요.
  • =1.10: declaringClass 합성 프로퍼티를 제거해요.

컴파일러 옵션 -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.9: 이 경고를 오류로 올려요.

표준 라이브러리

Range/Progression이 Collection을 구현하기 시작할 때 잠재적 오버로드 해석 변경에 대해 경고

Issue: KT-49276

Component: Core language / kotlin-stdlib

Incompatible change type: source

Short summary: Kotlin 1.9에서 표준 progression과 그로부터 상속된 구체적인 range들이 Collection 인터페이스를 구현할 계획이에요. 어떤 메서드에 요소를 받는 오버로드와 컬렉션을 받는 오버로드 두 가지가 있다면, 이로 인해 오버로드 해석에서 다른 오버로드가 선택될 수 있어요. Kotlin은 그런 오버로드된 메서드가 range 또는 progression 인자로 호출될 때 경고나 오류를 보고해 이 상황을 눈에 보이게 만들 거예요.

Deprecation cycle:

  • 1.6.20: 표준 progression이나 그 range 상속자가 인자로 전달된 오버로드된 메서드가 호출될 때, 이 progression/range가 Collection 인터페이스를 구현하면 향후 이 호출에서 다른 오버로드가 선택될 것이라면 경고를 보고해요.
  • 1.8.0: 이 경고를 오류로 올려요.
  • 1.9.0: 오류 보고를 중단하고, progression에서 Collection 인터페이스를 구현해서 영향받는 경우에 오버로드 해석 결과를 변경해요.

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.8.20: JS-IR 타깃에 대해 stdlib에서 deprecated 함수를 제거해요.
  • = 1.9: kotlinx.* 패키지의 API를 별도 라이브러리로 옮겨요.

일부 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.9.0: deprecation 수준을 오류로 올려요.
  • =1.10.0: deprecated 함수를 공개 API에서 제거해요.

도구

KotlinCompile 태스크의 classpath 프로퍼티 deprecation 수준 상향

Issue: KT-51679

Component: Gradle

Incompatible change type: source

Short summary: KotlinCompile 태스크의 classpath 프로퍼티가 deprecated 처리돼요.

Deprecation cycle:

  • 1.7.0: classpath 프로퍼티가 deprecated 처리돼요.
  • 1.8.0: deprecation 수준을 오류로 올려요.
  • =1.9.0: deprecated 함수를 공개 API에서 제거해요.

kapt.use.worker.api Gradle 프로퍼티 제거

Issue: KT-48827

Component: Gradle

Incompatible change type: behavioral

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

Deprecation cycle:

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

kotlin.compiler.execution.strategy 시스템 프로퍼티 제거

Issue: KT-51831

Component: Gradle

Incompatible change type: behavioral

Short summary: 컴파일러 실행 전략을 선택하는 데 쓰이던 kotlin.compiler.execution.strategy 시스템 프로퍼티를 제거해요. 대신 Gradle 프로퍼티 kotlin.compiler.execution.strategy나 컴파일 태스크 프로퍼티 compilerExecutionStrategy를 사용해요.

Deprecation cycle:

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

컴파일러 옵션 변경 사항

Issues: KT-27301, KT-48532

Component: Gradle

Incompatible change type: source, binary

Short summary: 이 변경은 Gradle 플러그인 작성자에게 영향을 줄 수 있어요. kotlin-gradle-plugin에는 일부 내부 타입에 제네릭 파라미터가 추가됐어요(제네릭 타입이나 *를 추가해야 해요). KotlinNativeLink 태스크는 더 이상 AbstractKotlinNativeCompile 태스크를 상속하지 않아요. KotlinJsCompilerOptions.outputFile과 관련 KotlinJsOptions.outputFile 옵션은 deprecated 처리됐어요. 대신 Kotlin2JsCompile.outputFileProperty 태스크 입력을 사용해요. kotlinOptions 태스크 입력과 kotlinOptions{...} 태스크 DSL은 지원 모드에 있으며 향후 릴리스에서 deprecated 처리될 예정이에요. compilerOptionskotlinOptions는 태스크 실행 단계에서는 변경할 수 없어요(Kotlin 1.8의 새로운 기능의 예외 하나 참고). freeCompilerArgs는 불변 List<String>을 반환하므로 kotlinOptions.freeCompilerArgs.remove("something")은 실패해요. 예전 JVM 백엔드를 사용할 수 있게 해주던 useOldBackend 프로퍼티는 제거됐어요.

Deprecation cycle:

  • 1.8.0: KotlinNativeLink 태스크가 AbstractKotlinNativeCompile을 상속하지 않아요. KotlinJsCompilerOptions.outputFile과 관련 KotlinJsOptions.outputFile 옵션이 deprecated 처리돼요. 예전 JVM 백엔드를 사용할 수 있게 해주던 useOldBackend 프로퍼티가 제거돼요.

kotlin.internal.single.build.metrics.file 프로퍼티 deprecated 처리

Issue: KT-53357

Component: Gradle

Incompatible change type: source

Short summary: 빌드 리포트용 단일 파일을 지정하는 데 쓰이던 kotlin.internal.single.build.metrics.file 프로퍼티를 deprecated 처리해요. kotlin.build.report.single_file 프로퍼티를 kotlin.build.report.output=single_file과 함께 사용해요.

Deprecation cycle:

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

더 알아보기 (Learn more)