본문 바로가기
Kotlin/What's new

[Kotlin 번역] What's new in Kotlin 1.7.0

by 노력남자 2023. 9. 17.
반응형

2022년 6월 9일

 

Kotlin 1.7.0은 IntelliJ IDEA 2021.2, 2021.3 및 2022.1에서 사용 가능한 IDE 지원을 제공합니다.

Kotlin 1.7.0이 출시되었습니다. 이 버전에서는 새로운 Kotlin/JVM K2 컴파일러의 Alpha 버전이 공개되었으며 언어 기능을 안정화하고 JVM, JS 및 Native 플랫폼에서 성능 개선을 제공합니다.

이 버전에서 주요 업데이트 목록은 다음과 같습니다:

  • 새로운 Kotlin K2 컴파일러는 현재 Alpha 버전으로 제공되며 심각한 성능 향상을 제공합니다. 이 컴파일러는 JVM에서만 사용 가능하며 kapt를 포함한 컴파일러 플러그인 중 어떤 것도 작동하지 않습니다.
  • Gradle에서 증분 컴파일에 대한 새로운 접근 방식이 도입되었습니다. 이제 증분 컴파일은 의존하는 비-Kotlin 모듈 내에서 수행한 변경 사항을 지원하며 Gradle과 호환됩니다.
  • 옵트인 요구 어노테이션, 확실히 널이 아닌 타입 및 빌더 추론을 안정화했습니다.
  • 이제 타입 인자에 대한 밑줄 연산자가 있습니다. 이것을 사용하여 다른 타입이 지정된 경우 인자의 타입을 자동으로 추론할 수 있습니다.
  • 이 버전에서는 인라인 클래스의 인라인 값으로 위임에 대한 구현이 허용됩니다. 이제 대부분의 경우 메모리를 할당하지 않는 가벼운 래퍼를 만들 수 있습니다.


또한 이 비디오에서 이 버전의 변경 사항에 대한 간략한 개요를 찾을 수 있습니다:

 


새로운 Kotlin K2 컴파일러 - JVM의 Alpha 버전


이 Kotlin 릴리스는 새로운 Kotlin K2 컴파일러의 Alpha 버전을 소개합니다. 새로운 컴파일러는 새로운 언어 기능의 개발을 가속화하고 Kotlin이 지원하는 모든 플랫폼을 통합하며 성능 향상을 제공하고 컴파일러 확장을 위한 API를 제공하기 위해 설계되었습니다.

이미 새로운 컴파일러와 그 이점에 대한 자세한 설명을 게시했습니다:

  • 새 Kotlin 컴파일러로 가는 길
  • K2 컴파일러: 위에서 아래로 보기


중요한 점은 새로운 K2 컴파일러의 Alpha 버전은 주로 성능 향상에 중점을 두었으며 JVM 프로젝트에서만 작동합니다. Kotlin/JS, Kotlin/Native 또는 기타 멀티 플랫폼 프로젝트는 지원하지 않으며 kapt를 포함한 컴파일러 플러그인 중 어떤 것도 작동하지 않습니다.

우리의 벤치마크 결과는 내부 프로젝트에서 놀라운 결과를 보여줍니다:

 


KLOC/s 성능 숫자는 컴파일러가 초당 처리하는 코드 라인 수를 나타냅니다.

K2 컴파일러를 사용하여 JVM 프로젝트에서 성능 향상을 확인하고 이전 컴파일러의 결과와 비교할 수 있습니다. Kotlin K2 컴파일러를 활성화하려면 다음 컴파일러 옵션을 사용하십시오:

-Xuse-k2


또한 K2 컴파일러에는 여러 버그 수정이 포함되어 있습니다. 이 목록에서 상태: 열림인 문제조차도 K2에서 실제로 해결되었음을 유의하십시오.

다음 Kotlin 릴리스에서는 K2 컴파일러의 안정성을 향상시키고 더 많은 기능을 제공할 예정이니 기대하십시오!

Kotlin K2 컴파일러와 관련된 성능 문제가 발생하는 경우, 이를 우리의 이슈 트래커에 보고해 주시기 바랍니다.

 

언어

 

Kotlin 1.7.0에서는 위임을 통한 구현 및 타입 인자를 위한 새로운 밑줄 연산자 지원이 소개되며, 이전 릴리스에서 미리보기로 도입된 여러 언어 기능을 안정화합니다:

  • 인라인 클래스의 인라인 값으로 위임 구현 지원
  • 타입 인자를 위한 밑줄 연산자
  • 안정된 빌더 추론
  • 안정된 옵트인 요구 사항
  • 안정된 확실히 널이 아닌 타입

 

인라인 클래스의 인라인 값으로 위임 구현 허용


값이나 클래스 인스턴스에 대한 가벼운 래퍼를 만들려면 모든 인터페이스 메서드를 수동으로 구현해야 할 필요가 있습니다. 위임을 통한 구현은 이 문제를 해결하지만 1.7.0 이전에는 인라인 클래스와 함께 작동하지 않았습니다. 이 제한이 제거되어 대부분의 경우 메모리를 할당하지 않는 가벼운 래퍼를 만들 수 있습니다.

 

interface Bar {
    fun foo() = "foo"
}

@JvmInline
value class BarWrapper(val bar: Bar): Bar by bar

fun main() {
    val bw = BarWrapper(object: Bar {})
    println(bw.foo())
}


타입 인자를 위한 밑줄 연산자


Kotlin 1.7.0에서는 타입 인자를 위한 밑줄 연산자인 _를 소개합니다. 다른 타입이 지정된 경우 자동으로 타입 인자를 추론하는 데 사용할 수 있습니다.

 

abstract class SomeClass<T> {
    abstract fun execute(): T
}

class SomeImplementation : SomeClass<String>() {
    override fun execute(): String = "Test"
}

class OtherImplementation : SomeClass<Int>() {
    override fun execute(): Int = 42
}

object Runner {
    inline fun <reified S: SomeClass<T>, T> run(): T {
        return S::class.java.getDeclaredConstructor().newInstance().execute()
    }
}

fun main() {
    // SomeImplementation이 SomeClass<String>을 상속하기 때문에 T는 String으로 추론됩니다.
    val s = Runner.run<SomeImplementation, _>()
    assert(s == "Test")

    // OtherImplementation이 SomeClass<Int>를 상속하기 때문에 T는 Int로 추론됩니다.
    val n = Runner.run<OtherImplementation, _>()
    assert(n == 42)
}


밑줄 연산자를 변수 목록에서 어느 위치에나 사용하여 타입 인자를 추론할 수 있습니다.


안정된 빌더 추론


빌더 추론은 일반적인 타입 추론이 충분한 정보를 얻지 못할 때 사용되는 일종의 타입 추론입니다. 이는 제네릭 빌더 함수를 호출할 때 유용하며, 람다 인자 내부의 다른 호출에 대한 타입 정보를 사용하여 호출의 타입 인자를 추론하는 데 도움을 줍니다.

1.7.0부터는 빌더 추론이 자동으로 활성화되며, 일반적인 타입 추론으로 충분한 정보를 얻을 수 없는 경우 -Xenable-builder-inference 컴파일러 옵션을 지정하지 않고도 활성화됩니다. 이 옵션은 1.6.0에서 도입되었습니다.

 

커스텀 제네릭 빌더 사용법은 여기서 알아보세요.

 

안정된 옵트인 요구 사항

 

옵트인 요구 사항은 이제 안정적이며 추가 컴파일러 구성을 필요로하지 않습니다.

1.7.0 이전에 옵트인 기능 자체는 경고를 피하기 위해 -opt-in=kotlin.RequiresOptIn 인수가 필요했습니다. 이제 이를 더 이상 필요로하지 않지만 여전히 다른 주석, 모듈 전역으로 옵트인하기 위한 컴파일러 인수 -opt-in을 사용할 수 있습니다.


안정된 확실히 널이 아닌 타입


Kotlin 1.7.0에서는 확실히 널이 아닌 타입이 안정화되었습니다. 이는 제네릭 Java 클래스 및 인터페이스를 확장할 때 더 나은 상호 운용성을 제공합니다.

새로운 구문 T & Any를 사용하여 사용 지점에서 제네릭 타입 매개변수를 확실히 널이 아닌 것으로 표시할 수 있습니다. 이 구문 형태는 교차 타입에 대한 표기법에서 비롯되었으며 왼쪽 측에는 널이 가능한 상위 경계가 있는 타입 매개변수가 있고, 오른쪽 측에는 널이 아닌 Any가 있는 경우에만 사용할 수 있습니다.

 

fun <T> elvisLike(x: T, y: T & Any): T & Any = x ?: y

fun main() {
    // OK
    elvisLike<String>("", "").length
    // 에러: 'null'은 널이 아닌 타입의 값일 수 없습니다.
    elvisLike<String>("", null).length

    // OK
    elvisLike<String?>(null, "").length
    // 에러: 'null'은 널이 아닌 타입의 값일 수 없습니다.
    elvisLike<String?>(null, null).length
}


확실히 널이 아닌 타입에 대해 자세히 알아보려면 이 KEEP을 참조하세요.

 

Kotlin/JVM


이 릴리스에서는 Kotlin/JVM 컴파일러의 성능 향상과 새로운 컴파일러 옵션을 가져왔습니다. 또한 함수형 인터페이스 생성자에 대한 호출 가능한 참조가 Stable 상태로 변경되었습니다. 또한 1.7.0 이후로 Kotlin/JVM 컴파일에 대한 기본 대상 버전이 1.8로 변경되었습니다.

  • 컴파일러 성능 최적화
  • 새로운 컴파일러 옵션 -Xjdk-release
  • 함수형 인터페이스 생성자에 대한 안정된 호출 가능한 참조
  • JVM 대상 버전 1.6 제거


컴파일러 성능 최적화


Kotlin 1.7.0은 Kotlin/JVM 컴파일러의 성능 향상을 소개합니다. 벤치마크에 따르면 Kotlin 1.6.0과 비교하여 컴파일 시간이 평균적으로 10% 감소했습니다. 예를 들어 kotlinx.html을 사용하는 프로젝트와 같이 인라인 함수를 많이 사용하는 프로젝트는 바이트 코드 후 처리의 개선 덕분에 빠르게 컴파일됩니다.


새로운 컴파일러 옵션: -Xjdk-release


Kotlin 1.7.0에서는 새로운 컴파일러 옵션인 -Xjdk-release를 제공합니다. 이 옵션은 javac의 명령줄 --release 옵션과 유사합니다. -Xjdk-release 옵션은 대상 바이트 코드 버전을 제어하며 클래스 패스의 JDK API를 지정된 Java 버전으로 제한합니다. 예를 들어, kotlinc -Xjdk-release=1.8은 의존성에서 JDK 버전이 9 이상인 경우에도 java.lang.Module을 참조하는 것을 허용하지 않습니다.

이 옵션은 모든 JDK 배포본에 대해 항상 효과적인 것은 아닙니다.

이 YouTrack 티켓에서 피드백을 남겨 주세요.


함수형 인터페이스 생성자에 대한 안정된 호출 가능한 참조


함수형 인터페이스 생성자에 대한 호출 가능한 참조가 이제 안정화되었습니다. 호출 가능한 참조를 사용하여 생성자 함수가 있는 인터페이스에서 함수형 인터페이스로 마이그레이션하는 방법에 대해 알아보세요.

발견한 문제가 있다면 YouTrack에서 보고해 주세요.


JVM 대상 버전 1.6 제거


Kotlin/JVM 컴파일에 대한 기본 대상 버전은 1.8입니다. 1.6 대상은 제거되었습니다.

1.8 이상의 JVM 대상으로 마이그레이션하십시오. 다음에서 JVM 대상 버전을 업데이트하는 방법을 알아보세요:

 

 

Kotlin/Native


Kotlin 1.7.0은 Objective-C 및 Swift 호환성에 대한 변경 사항을 포함하고 이전 릴리스에서 도입된 기능을 안정화합니다. 또한 새로운 메모리 관리자를 위한 성능 개선과 다른 업데이트를 제공합니다:


새로운 메모리 관리자의 성능 개선


새로운 Kotlin/Native 메모리 관리자는 Alpha 상태입니다. 이것은 미래에 호환되지 않게 변경될 수 있으며 수동으로 마이그레이션을 요구할 수 있습니다. YouTrack에서 피드백을 주시면 감사하겠습니다.

새로운 메모리 관리자는 아직 Alpha 상태이지만 Stable로 발전하고 있습니다. 이 릴리스에서는 특히 가비지 컬렉션(GC)에서 새 메모리 관리자에 대한 중요한 성능 개선을 제공합니다. 특히 1.6.20에 도입된 sweep 단계의 동시 구현이 기본으로 활성화되었습니다. 이는 GC를 위한 애플리케이션 일시 중지 시간을 줄이는 데 도움을 줍니다. 새로운 GC 스케줄러는 특히 큰 힙에 대한 GC 빈도를 선택하는 데 더 뛰어납니다.

또한 디버그 바이너리를 특별히 최적화하여 메모리 관리자의 구현 코드에서 올바른 최적화 수준과 링크 시간 최적화를 사용하도록 보장했습니다. 이로써 벤치마크에서 디버그 바이너리의 실행 시간을 대략 30% 개선할 수 있었습니다.

새 메모리 관리자를 프로젝트에서 사용해 보고 YouTrack에서 피드백을 공유해 주세요.


JVM 및 JS IR 백엔드와 통합된 컴파일러 플러그인 ABI


Kotlin 1.7.0부터 Kotlin Multiplatform Gradle 플러그인은 Kotlin/Native를 위한 임베디드 컴파일러 jar를 기본으로 사용합니다. 이 기능은 1.6.0에서 실험적으로 발표되었으며 이제 Stable 상태이며 사용할 준비가 되었습니다.

이 개선 사항은 라이브러리 제작자에게 매우 유용합니다. 이전에는 Kotlin/Native용으로 별도의 아티팩트를 제공해야 했지만 이제 같은 컴파일러 플러그인 아티팩트를 Native 및 다른 지원되는 플랫폼에 사용할 수 있습니다.

이 기능은 기존 플러그인에 대한 마이그레이션 단계를 수행해야 할 수도 있습니다.

이 YouTrack 이슈에서 업데이트를 위한 플러그인을 준비하는 방법을 알아보세요.

 

스탠드얼론 Android 실행 파일 지원


Kotlin 1.7.0은 Android Native 대상에 대한 표준 실행 파일 생성을 완전히 지원합니다. 이 기능은 1.6.20에 도입되었으며 이제 기본적으로 활성화되었습니다.

Kotlin/Native가 공유 라이브러리를 생성하던 이전 동작으로 되돌리려면 다음 설정을 사용하세요:

 

binaryOptions["androidProgramType"] = "nativeActivity"


Swift async/await와의 상호 운용성: KotlinUnit 대신 Void 반환


Kotlin suspend 함수는 이제 Swift에서 KotlinUnit 대신 Void 유형을 반환합니다. 이것은 Swift의 async/await와의 상호 운용성이 개선된 결과입니다. 이 기능은 1.6.20에서 도입되었으며 이 릴리스에서는 이 동작이 기본적으로 활성화됩니다.

더 이상 kotlin.native.binary.unitSuspendFunctionObjCExport=proper 속성을 사용하여 이러한 함수에 대한 올바른 유형을 반환할 필요가 없습니다.


Objective-C 브릿지를 통한 선언되지 않은 예외 금지


Swift/Objective-C 코드에서 Kotlin 코드를 호출하고 이 코드에서 예외가 발생하는 경우 (또는 그 반대의 경우) 이 예외는 명시적으로 예외를 처리한 코드에서 처리되어야 합니다. 예외를 언어 간 변환을 사용하여 전달을 허용한 경우에만 다른 언어로 예외를 전달할 수 있습니다 (예: @Throws 주석 사용).

이전에 Kotlin에는 Kotlin 버전과 관계없이 언어 간에서 일부 경우에선 선언되지 않은 예외가 다른 언어로 "누출"되는 다른 의도하지 않은 동작이 있었습니다. Kotlin 1.7.0은 이 문제를 수정하고 이제 이러한 경우 프로그램 종료로 이어집니다.

예를 들어 Kotlin에서 { throw Exception() } 람다가 있는 경우 Kotlin 1.7.0에서는 예외가 Swift 코드에 도달하면 즉시 종료됩니다. 이전 Kotlin 버전에서는 이러한 예외가 Swift 코드로 누출될 수 있었습니다.

@Throws 주석은 이전과 동일하게 작동합니다.


개선된 CocoaPods 통합


Kotlin 1.7.0부터는 CocoaPods를 프로젝트에 통합하려면 cocoapods-generate 플러그인을 설치할 필요가 없습니다.

이전에는 CocoaPods 종속성 관리자와 Kotlin Multiplatform Mobile 프로젝트의 iOS 종속성을 처리하기 위해 CocoaPods 및 cocoapods-generate 플러그인을 모두 설치해야 했습니다.

이제 CocoaPods 통합 설정이 더 쉽고, cocoapods-generate가 Ruby 3 이상에서 설치되지 않는 문제를 해결했습니다. 이제 Apple M1에서 더 잘 작동하는 최신 Ruby 버전도 지원됩니다.

초기 CocoaPods 통합 설정 방법을 확인하세요.

 

Kotlin/Native 컴파일러 다운로드 URL 재정의


Kotlin 1.7.0부터는 Kotlin/Native 컴파일러의 다운로드 URL을 사용자 정의할 수 있습니다. CI에서 외부 링크가 금지된 경우 유용합니다.

기본 기본 URL https://download.jetbrains.com/kotlin/native/builds를 재정의하려면 다음 Gradle 속성을 사용하세요:

 

kotlin.native.distribution.baseDownloadUrl=https://example.com


다운로더는 실제 컴파일러 배포를 다운로드하기 위해 이 기본 URL에 네이티브 버전과 대상 OS를 추가합니다.

 

Kotlin/JS


Kotlin/JS는 JS IR 컴파일러 백엔드 및 기타 업데이트에 대한 추가 개선 사항을 받고 있으며 개발 경험을 더 향상시킬 수 있습니다:


새로운 IR 백엔드의 성능 개선


이 릴리스에는 개발 경험을 개선할 몇 가지 주요 업데이트가 포함되어 있습니다:

  • Kotlin/JS의 증분 컴파일 성능이 크게 향상되었습니다. JS 프로젝트를 빌드하는 데 걸리는 시간이 줄어들었습니다. 많은 경우에는 증분 재빌드가 이제 많은 경우에 레거시 백엔드와 대체로 비슷할 것으로 예상됩니다.
  • Kotlin/JS 최종 번들은 최종 아티팩트의 크기를 크게 줄였으므로 더 적은 공간을 필요로 합니다. 일부 큰 프로젝트의 경우 레거시 백엔드 대비 제품 번들 크기에서 최대 20% 감소한 것으로 측정되었습니다.
  • 인터페이스의 타입 체크가 수배로 개선되었습니다.
  • Kotlin은 더 높은 품질의 JS 코드를 생성합니다

 

IR 사용시 멤버 이름의 압축


Kotlin/JS IR 컴파일러는 이제 Kotlin 클래스와 함수 간의 관계에 대한 내부 정보를 사용하여 더 효율적인 압축을 적용합니다. 함수, 속성 및 클래스의 이름을 짧게 만들어 함수를 더 효과적으로 압축하고 번들 애플리케이션 크기를 줄입니다.

이러한 종류의 압축은 제품 모드에서 Kotlin/JS 애플리케이션을 빌드할 때 자동으로 적용되며 기본적으로 활성화됩니다. 멤버 이름 압축을 비활성화하려면 -Xir-minimized-member-names 컴파일러 플래그를 사용하세요:

kotlin {
    js(IR) {
        compilations.all {
            compileKotlinTask.kotlinOptions.freeCompilerArgs += listOf("-Xir-minimized-member-names=false")
        }
    }
}


IR 백엔드의 폴리필을 통한 이전 브라우저 지원


Kotlin/JS의 IR 컴파일러 백엔드는 이제 레거시 백엔드와 동일한 폴리필을 포함합니다. 이로써 새 컴파일러로 컴파일된 코드를 Kotlin 표준 라이브러리에서 사용하는 ES2015의 모든 메서드를 지원하지 않는 이전 브라우저에서 실행할 수 있게 됩니다. 프로젝트에서 실제로 사용하는 폴리필만 최종 번들에 포함되므로 번들 크기에 미치는 잠재적인 영향을 최소화합니다.

이 기능은 IR 컴파일러를 사용할 때 기본적으로 활성화되며 구성할 필요가 없습니다.


JS 표현식에서 JavaScript 모듈을 동적으로 로드


JavaScript 모듈을 다룰 때 대부분의 응용 프로그램은 JavaScript 모듈 통합으로 다루는 정적 임포트를 사용합니다. 그러나 Kotlin/JS에는 응용 프로그램에서 런타임에서 JavaScript 모듈을 동적으로 로드하는 메커니즘이 없었습니다.

Kotlin 1.7.0부터는 js 블록에서 JavaScript에서 import 문을 지원하여 런타임에 응용 프로그램에 패키지를 동적으로 가져올 수 있게 되었습니다:

 

val myPackage = js("import('my-package')")


JavaScript 테스트 러너에 대한 환경 변수 지정


Node.js 패키지 해결을 조정하거나 Node.js 테스트에 외부 정보를 전달하려면 JavaScript 테스트 러너에서 사용하는 환경 변수를 지정할 수 있습니다. 환경 변수를 정의하려면 빌드 스크립트의 testTask 블록에서 키-값 쌍을 사용하여 environment() 함수를 사용하세요:

kotlin {
    js {
        nodejs {
            testTask {
                environment("key", "value")
            }
        }
    }
}

 

표준 라이브러리

 

Kotlin 1.7.0 표준 라이브러리는 다양한 변경 및 개선 사항을 받았습니다. 이 변경 사항들은 새로운 기능을 도입하고 실험적인 기능을 안정화하며 Native, JS 및 JVM에 대한 명명된 캡처 그룹 지원을 통일합니다.


min() 및 max() 컬렉션 함수는 이제 non-nullable로 반환됩니다.


Kotlin 1.4.0에서는 min() 및 max() 컬렉션 함수의 이름을 minOrNull() 및 maxOrNull()로 변경했습니다. 이러한 새로운 이름은 수신 컬렉션이 비어 있으면 null을 반환하는 동작을 더 잘 반영합니다. 이렇게 함으로써 함수의 동작을 Kotlin 컬렉션 API 전반에서 사용되는 네이밍 규칙과 일치시킬 수 있었습니다.

minBy(), maxBy(), minWith(), maxWith()도 Kotlin 1.4.0에서 이와 같은 *OrNull() 동의어를 얻었습니다. 이 변경 사항에 영향을받는 이전 함수들은 점진적으로 사용하지 않게되었습니다.

Kotlin 1.7.0에서는 원래 함수 이름을 non-nullable 반환 유형으로 다시 도입합니다. 새로운 min(), max(), minBy(), maxBy(), minWith(), maxWith() 함수는 이제 엄격하게 컬렉션 요소를 반환하거나 예외를 throw합니다.

fun main() {
    val numbers = listOf<Int>()
    println(numbers.maxOrNull()) // "null"
    println(numbers.max()) // "Exception in... Collection is empty."
}

 

특정 인덱스에서 정규 표현식 매칭


1.5.30에 도입된 Regex.matchAt() 및 Regex.matchesAt() 함수는 이제 Stable 상태입니다. 이 함수들은 문자열이나 CharSequence에서 특정 위치에서 정규 표현식과 정확히 일치하는지 확인하는 방법을 제공합니다.

matchesAt() 함수는 일치 여부를 확인하고 boolean 결과를 반환합니다:

fun main() {
    val releaseText = "Kotlin 1.7.0 is on its way!"
    // 정규 표현식: 하나의 숫자, 점, 하나의 숫자, 점, 하나 이상의 숫자
    val versionRegex = "\\d[.]\\d[.]\\d+".toRegex()

    println(versionRegex.matchesAt(releaseText, 0)) // "false"
    println(versionRegex.matchesAt(releaseText, 7)) // "true"
}


matchAt() 함수는 매치가 발견되면 매치를 반환하고 발견되지 않으면 null을 반환합니다:

fun main() {
    val releaseText = "Kotlin 1.7.0 is on its way!"
    val versionRegex = "\\d[.]\\d[.]\\d+".toRegex()

    println(versionRegex.matchAt(releaseText, 0)) // "null"
    println(versionRegex.matchAt(releaseText, 7)?.value) // "1.7.0"
}


확장된 이러한 기능에 대한 피드백은 YouTrack 이슈에서 환영합니다.


이전 언어 및 API 버전의 확장된 지원


넓은 범위의 이전 Kotlin 버전에서 사용할 수있는 라이브러리를 개발하려는 라이브러리 개발자를 지원하고, 주요 Kotlin 릴리스의 빈도가 증가함에 따라, 이전 언어 및 API 버전에 대한 지원을 확장했습니다.

Kotlin 1.7.0에서는 이전 언어 및 API 버전을 두 개가 아닌 세 개까지 지원합니다. 이것은 Kotlin 1.4.0부터 1.7.0까지의 버전을 대상으로하는 라이브러리 개발을 지원함을 의미합니다. 역 호환성에 대한 자세한 내용은 호환성 모드를 참조하십시오.


반영을 통한 주석 액세스


1.6.0에 처음 소개된 KAnnotatedElement.findAnnotations() 확장 함수는 이제 Stable 상태입니다. 이 반영 함수는 주어

진 요소에 대한 주석을 모두 반환하며 개별적으로 적용된 반복 주석을 포함합니다.

@Repeatable
annotation class Tag(val name: String)

@Tag("First Tag")
@Tag("Second Tag")
fun taggedFunction() {
    println("I'm a tagged function!")
}

fun main() {
    val x = ::taggedFunction
    val foo = x as KAnnotatedElement
    println(foo.findAnnotations<Tag>()) // [@Tag(name=First Tag), @Tag(name=Second Tag)]
}


안정된 깊은 재귀 함수


깊은 재귀 함수는 Kotlin 1.4.0부터 실험적인 기능으로 사용할 수 있었으며 Kotlin 1.7.0에서 Stable 상태로 변경되었습니다. DeepRecursiveFunction을 사용하여 실제 호출 스택 대신 힙에 스택을 유지하는 함수를 정의할 수 있습니다. 이를 통해 매우 깊은 재귀 계산을 실행할 수 있습니다. 깊은 재귀 함수를 호출하려면 invoke를 사용합니다.

이 예에서는 이진 트리의 깊이를 재귀적으로 계산하는 데 깊은 재귀 함수를 사용합니다. 이 샘플 함수는 자체를 재귀적으로 호출 100,000 번 하더라도 StackOverflowError가 발생하지 않습니다.

class Tree(val left: Tree?, val right: Tree?)

val calculateDepth = DeepRecursiveFunction<Tree?, Int> { t ->
    if (t == null) 0 else maxOf(
        callRecursive(t.left),
        callRecursive(t.right)
    ) + 1
}

fun main() {
    // 깊이가 100,000인 트리 생성
    val deepTree = generateSequence(Tree(null, null)) { prev ->
        Tree(prev, null)
    }.take(100_000).last()

    println(calculateDepth(deepTree)) // 100000
}


재귀 깊이가 1000 호출을 초과하는 코드에서 깊은 재귀 함수를 사용하는 것을 고려하십시오.


인라인 클래스를 기반으로한 시간 표시


Kotlin 1.7.0은 TimeSource.Monotonic의 시간 표시를 인라인 값 클래스로 변경하여 시간 측정 기능의 성능을 개선합니다. 이렇게 함으로써 markNow(), elapsedNow(), measureTime(), measureTimedValue()와 같은 함수 호출에서 TimeMark 인스턴스에 대한 래퍼 클래스를 할당하지 않아도 됩니다. 특히 핫 패스의 일부 코드를 측정할 때 이러한 최적화는 측정의 성능 영향을 최소화하는 데 도움이 될 수 있습니다.

@OptIn(ExperimentalTime::class)
fun main() {
    val mark = TimeSource.Monotonic.markNow() // 반환된 `TimeMark`는 인라인 클래스입니다
    val elapsedDuration = mark.elapsedNow()
}


이 최적화는 TimeMark를 정적으로 알려진 TimeSource.Monotonic에서 가져온 경우에만 사용할 수 있습니다.


Java Optionals를 위한 새로운 실험적인 확장 함수


Kotlin 1.7.0에는 Java의 Optional 클래스와 함께 작업을 간소화하는 데 도움이 되는 새로운 편의 기능이 함께 제공됩니다. 이러한 새로운 함수는 JVM에서 optional 객체를 풀고 변환하는 데 사용할 수 있으며 Java API와 작업하는 것을 보다 간결하게 만들어줍니다.

getOrNull(), getOrDefault(), getOrElse() 확장 함수를 사용하면 Optional이 있으면 값을 얻을 수 있습니다. 그렇지 않으면 null, 기본값 또는 함수에 의해 반환되는 값을 얻게 됩니다.

val presentOptional = Optional.of("I'm here!")

println(presentOptional.getOrNull())
// "I'm here!"

val absentOptional = Optional.empty<String>()

println(absentOptional.getOrNull())
// null
println(absentOptional.getOrDefault("Nobody here!"))
// "Nobody here!"
println(absentOptional.getOrElse {
    println("Optional was absent!")
    "Default value!"
})
// "Optional was absent!"
// "Default value!"


toList(), toSet(), asSequence() 확장 함수는 존재하는 Optional 값을 목록, 세트 또는 시퀀스로 변환하거나 그렇지 않으면 빈 컬렉션을 반환합니다. toCollection() 확장 함수는 이미 존재하는 대상 컬렉션에 Optional 값을 추가합니다.

val presentOptional = Optional.of("I'm here!")
val absentOptional = Optional.empty<String>()
println(presentOptional.toList() + "," + absentOptional.toList())
// ["I'm here!"], []
println(presentOptional.toSet() + "," + absentOptional.toSet())
// ["I'm here!"], []
val myCollection = mutableListOf<String>()
absentOptional.toCollection(myCollection)
println(myCollection)
// []
presentOptional.toCollection(myCollection)
println(myCollection)
// ["I'm here!"]
val list = listOf(presentOptional, absentOptional).flatMap { it.asSequence() }
println(list)
// [I'm here!"]


이러한 확장 함수는 Kotlin 1.7.0에서 실험적으로 도입되었습니다. Optional 확장에 대한 자세한 내용은 해당 KEEP에서 확인할 수 있습니다. 항상 Kotlin 이슈 트래커에서 피드백을 환영합니다.


JS 및 Native에서 명명된 캡처 그룹 지원


Kotlin 1.7.0부터는 명명된 캡처 그룹이 JVM뿐만 아니라 JS 및 Native 플랫폼에서도 지원됩니다.

캡처 그룹에 이름을 지정하려면 정규 표현식에서 (?<name>group) 구문을 사용하십시오. 그룹이 일치한 텍스트를 가져오려면 MatchGroupCollection.get() 함수를 호출하고 그룹 이름을 전달하면 됩니다.

이 예를 들어 도시 좌표를 일치시키는 예제를 고려해보겠습니다. 정규 표현식으로 일치한 그룹의 컬렉션을 가져오려면 groups를 사용하십시오. 이름을 사용하여 그룹의 내용을 찾는 방법과 번호(인덱스)를 사용하여 비교할 수 있습니다.

fun main() {
    val regex = "\\b(?<city>[A-Za-z\\s]+),\\s(?<state>[A-Z]{2}):\\s(?<areaCode>[0-9]{3})\\b".toRegex()
    val input = "Coordinates: Austin, TX: 123"
    val match = regex.find(input)!!
    println(match.groups["city"]?.value) // "Austin" — 이름으로
    println(match.groups[2]?.value) // "TX" — 번호로
}


이름 지정된 백레퍼런스


이제 명명된 캡처 그룹을 백레퍼런스할 때 그룹 이름을 사용할 수 있습니다. 백레퍼런스는 이전에 캡처 그룹에 의해 이미 일치된 텍스트와 일치합니다. 이를 위해 정규 표현식에서 \k<name> 구문을 사용하십시오.

fun backRef() {
    val regex = "(?<title>\\w+), yes \\k<title>".toRegex()
    val match = regex.find("Do you copy? Sir, yes Sir!")!!
    println(match.value) // "Sir, yes Sir"
    println(match.groups["title"]?.value) // "Sir"
}


대체 식에서 명명된 그룹 참조


대체 식에서 명명된 그룹 참조를 사용할 수 있습니다. 입력에서 지정된 정규 표현식의 모든 발생을 대체 표현식으로 대체하는 replace() 함수와 첫 번째 일치 항목만 교체하는 replaceFirst() 함수를 고려하십시오.

대체 문자열에서 ${name}의 발생은 지정된 이름의 캡처 그룹에 해당하는 부분 문자열로 대체됩니다. 이름으로 그룹 참조를 번호로 사용하는 대체를 비교할 수 있습니다.

fun dateReplace() {
    val dateRegex = Regex("(?<dd>\\d{2})-(?<mm>\\d{2})-(?<yyyy>\\d{4})")
    val input = "Date of birth: 27-04-2022"
    println(dateRegex.replace(input, "\${yyyy}-\${mm}-\${dd}")) // "Date of birth: 2022-04-27" — 이름으로
    println(dateRegex.replace(input, "\$3-\$2-\$1")) // "Date of birth: 2022-04-27" — 번호로
}

 

Gradle


이 릴리스에서는 새로운 빌드 보고서, Gradle 플러그인 변형 지원, kapt의 새로운 통계 등이 소개되었습니다.


증분 컴파일에 대한 새로운 접근 방식


이 새로운 증분 컴파일 접근 방식은 실험적입니다. 언제든지 중단되거나 변경될 수 있습니다. 옵트인이 필요합니다 (자세한 내용은 아래 참조). 평가 목적으로만 사용하도록 권장하며 YouTrack에서 피드백을 기다리고 있습니다.

Kotlin 1.7.0에서는 다른 모듈 간 변경 사항에 대한 증분 컴파일을 재작업했습니다. 이제 증분 컴파일은 종속되지 않은 비-Kotlin 모듈 내에서 발생한 변경 사항에 대해서도 지원되며 Gradle 빌드 캐시와 호환됩니다. 컴파일 피해를 방지하기 위한 지원도 개선되었습니다.

이 새로운 접근 방식의 가장 큰 이점은 빌드 캐시를 사용하거나 비-Kotlin Gradle 모듈에서 자주 변경 사항을 만드는 경우에 나타날 것으로 예상됩니다. Kotlin 프로젝트의 kotlin-gradle-plugin 모듈에서의 테스트에서 캐시 히트 이후의 변경 사항에 대한 개선이 80% 이상 나타납니다.

이 새로운 접근 방식을 시도하려면 gradle.properties에서 다음 옵션을 설정하세요:

 

kotlin.incremental.useClasspathSnapshot=true


현재 증분 컴파일 접근 방식은 Gradle 빌드 시스템의 JVM 백엔드에서만 사용할 수 있습니다.

이 기술을 안정화하고 다른 백엔드(JS 등) 및 빌드 시스템을 지원하도록 계획 중입니다. 이 컴파일 방식에서 발견한 문제나 이상한 동작에 대한 YouTrack에서의 보고를 환영합니다. 감사합니다!

Kotlin 팀은 Ivan Gavrilovic, Hung Nguyen, Cédric Champeau 및 다른 외부 기여자들에게 도움을 준 것에 대해 매우 감사합니다.


Kotlin 컴파일러 작업을 위한 빌드 보고서


Kotlin 빌드 보고서는 실험적입니다. 언제든지 중단되거나 변경될 수 있습니다. 옵트인이 필요합니다 (자세한 내용은 아래 참조). 평가 목적으로만 사용하도록 하며 YouTrack에서 피드백을 기대합니다.

Kotlin 1.7.0에서는 컴파일러 성능을 추적하는 빌드 보고서를 소개합니다. 이 보고서에는 다양한 컴파일 단계의 지속 시간 및 증분 컴파일이 되지 않았을 때의 이유가 포함되어 있습니다.

빌드 보고서는 다음과 같은 경우에 유용합니다:

  • Gradle 빌드가 너무 많은 시간을 소요하고 성능 문제의 원인을 이해하려는 경우.
  • 동일한 프로젝트의 컴파일 시간이 때로는 몇 초, 때로는 몇 분이 걸리는 경우.


빌드 보고서를 활성화하려면 gradle.properties에서 빌드 보고서 출력을 저장할 위치를 선언하세요:

 

kotlin.build.report.output=file


다음 값(및 그들의 조합)을 사용할 수 있습니다:

- file은 로컬 파일에 빌드 보고서를 저장합니다.

 

- build_scan은 빌드 스캔의 사용자 지정 값 섹션에 빌드 보고서를 저장합니다.

 

Gradle Enterprise 플러그인은 사용자 지정 값 및 그 길이를 제한합니다. 큰 프로젝트에서는 일부 값이 손실될 수 있습니다.

 

- http는 HTTP(S)를 사용하여 빌드 보고서를 게시합니다. POST 메서드는 JSON 형식으로 메트릭을 보냅니다. 데이터는 버전마다 변경될 수 있습니다. 현재 버전의 데이터는 Kotlin 저장소에서 볼 수 있습니다.

오랜 시간 컴파일을 위한 빌드 보고서를 분석할 때 도움이 되는 두 가지 일반적인 경우가 있습니다:

- 빌드가 증분이 아니었습니다. 그 이유를 분석하고 기본 문제를 해결하세요.

- 빌드가 증분이었지만 시간이 너무 오래 걸렸습니다. 소스 파일을 재구성

하려고 노력하세요. 큰 파일을 나누거나 별도의 클래스를 다른 파일에 저장하거나 큰 클래스를 리팩토링하거나 최상위 함수를 다른 파일에 선언하는 등의 작업을 수행하세요.

빌드 보고서를 인프라에서 사용해 보기를 권장합니다. 피드백이나 문제를 발견하거나 개선 제안을 하려면 우리 이슈 트래커에서 보고해 주시기 바랍니다. 감사합니다!


최소 지원 버전 업데이트


Kotlin 1.7.0부터 최소 지원 Gradle 버전은 6.7.1입니다. Gradle 플러그인 변형 및 새 Gradle API를 지원하기 위해 버전을 올려야 했습니다. 향후에는 Gradle 플러그인 변형 기능 덕분에 최소 지원 버전을 더 자주 올릴 필요가 없을 것으로 기대합니다.

또한 최소 지원 Android Gradle 플러그인 버전은 이제 3.6.4입니다.


Gradle 플러그인 변형 지원


Gradle 7.0에서는 Gradle 플러그인 작성자를 위한 새로운 기능인 변형 있는 플러그인을 소개했습니다. 이 기능을 사용하면 Gradle 버전 7.1 미만을 지원하면서도 새로운 Gradle 기능을 지원하기가 더 쉬워집니다. Gradle에서 변형 선택에 대해 자세히 알아보세요.

Gradle 플러그인 변형을 사용하면 다른 Gradle 버전용으로 다양한 Kotlin Gradle 플러그인 변형을 제공할 수 있습니다. 목표는 가장 오래된 지원 Gradle 버전에 해당하는 주요 Kotlin 컴파일을 지원하는 주요 변형입니다. 각 변형은 해당 릴리스에서의 Gradle 기능을 위한 구현을 갖습니다. 최신 변형은 가장 넓은 Gradle 기능 세트를 지원합니다. 이 접근 방식으로 오래된 Gradle 버전에 대한 지원을 제한된 기능으로 확장할 수 있습니다.

현재 Kotlin Gradle 플러그인에는 두 가지 변형만 있습니다.

  • Gradle 버전 6.7.1~6.9.3용 main
  • Gradle 버전 7.0 이상용 gradle70


향후 Kotlin 릴리스에서 더 많은 변형을 추가할 수 있습니다.

빌드에서 사용하는 변형을 확인하려면 --info 로그 레벨을 활성화하고 출력에서 Using Kotlin Gradle plugin으로 시작하는 문자열을 찾으세요. 예를 들어 Using Kotlin Gradle plugin main variant입니다.

Gradle에서 변형 선택에 대한 몇 가지 알려진 문제에 대한 해결책은 다음과 같습니다:

pluginManagement의 ResolutionStrategy는 다중 변형 플러그인에 대해 작동하지 않습니다.

플러그인이 buildSrc 공통 종속성으로 추가될 때 플러그인 변형이 무시됩니다.

이 YouTrack 티켓에서 피드백을 남겨주세요.


Kotlin Gradle 플러그인 API의 업데이트


Kotlin Gradle 플러그인 API 아티팩트에는 여러 개선 사항이 포함되어 있습니다:

- 사용자 구성 가능한 입력을 가진 Kotlin/JVM 및 Kotlin/kapt 작업을 위한 새로운 인터페이스가 있습니다.

 

- KotlinBasePlugin 인터페이스는 모든 Kotlin 플러그인이 상속하는 새로운 인터페이스입니다. 모든 Kotlin Gradle 플러그인(Java, JS, Multiplatform, Native 및 기타 플랫폼)이 적용될 때 일부 구성 작업을 트리거하려는 경우에 이 인터페이스를 사용하세요:

 

project.plugins.withType<org.jetbrains.kotlin.gradle.plugin.KotlinBasePlugin>() {
    // 여기에서 작업을 구성하세요
}


KotlinBasePlugin에 대한 피드백을 이 YouTrack 티켓에서 남겨주세요.

- Android Gradle 플러그인이 자체적으로 Kotlin 컴파일을 구성하도록 Kotlin 플러그인 API를 기반으로 작업을 진행했습니다. 이제 Kotlin Android Gradle 플러그인을 빌드에 추가할 필요가 없습니다. Kotlin Android Gradle 플러그인을 더 이상 빌드 스크립트에 추가할 필요가 없습니다. 추가 지원을 확인하려면 Android Gradle 플러그인 릴리스 공지를 확인하고 시도해보세요!

 

plugins DSL을 통해 sam-with-receiver 컴파일러 플러그인을 사용 가능


plugins DSL을 통해 sam-with-receiver 컴파일러 플러그인을 사용할 수 있습니다:

 

plugins {
    id("org.jetbrains.kotlin.plugin.sam.with.receiver") version "$kotlin_version"
}


컴파일 작업에 대한 변경 내용


이 릴리스에서 컴파일 작업에는 많은 변경 사항이 있습니다:

  • Kotlin 컴파일 작업은 더 이상 Gradle AbstractCompile 작업을 상속하지 않습니다. DefaultTask만 상속합니다.
  • AbstractCompile 작업에는 sourceCompatibility 및 targetCompatibility 입력이 있습니다. AbstractCompile 작업이 더 이상 상속되지 않았으므로 이러한 입력은 Kotlin 사용자 스크립트에서 더 이상 사용할 수 없습니다.
  • SourceTask.stableSources 입력은 더 이상 사용되지 않으며 sources 입력을 사용해야 합니다. setSource(...) 메서드는 여전히 사용 가능합니다.
  • 모든 컴파일 작업은 컴파일에 필요한 라이브러리 목록을 위해 libraries 입력을 사용합니다. KotlinCompile 작업은 여전히 폐기 예정인 Kotlin 속성 classpath을 가지고 있으며 향후 릴리스에서 제거될 예정입니다.
  • 컴파일 작업은 여전히 PatternFilterable 인터페이스를 구현하며 Kotlin 소스를 필터링할 수 있도록 합니다. sourceFilesExtensions 입력은 PatternFilterable 메서드를 사용하는 대신에 제거되었습니다.
  • 폐기된 Gradle destinationDir: File 출력이 destinationDirectory: DirectoryProperty 출력으로 대체되었습니다.
  • Kotlin/Native AbstractNativeCompile 작업은 AbstractKotlinCompileTool 베이스 클래스를 상속하도록 변경되었습니다. 이것은 Kotlin/Native 빌드 도구를 다른 도구에 통합하는 첫 번째 단계입니다.


이 YouTrack 티켓에서 피드백을 남겨주세요.


kapt에서 각 어노테이션 프로세서에 의해 생성된 파일의 통계


kotlin-kapt Gradle 플러그인은 이미 각 프로세서에 대한 성능 통계를 보고합니다. Kotlin 1.7.0부터는 각 어노테이션 프로세서에 대한 생성된 파일 수에 대한 통계도 보고할 수 있습니다.

이것은 빌드의 일부로 불필요한 어노테이션 프로세서를 트리거하는 모듈이 있는지 추적하는 데 유용합니다. 생성된 보고서를 사용하여 불필요한 어노테이션 프로세서를 트리거하는 모듈을 찾아 업데이트하여 방지할 수 있습니다.

통계를 활성화하려면 다음 단계를 수행하세요:

- build.gradle.kts에서 showProcessorStats 플래그를 true로 설정하세요:

 

kapt {
    showProcessorStats = true
}


- gradle.properties에서 kapt.verbose Gradle 속성을 true로 설정하세요:

 

kapt.verbose=true


명령줄 옵션을 통해서도 verbose 출력을 활성화할 수 있습니다.

통계는 info 레벨의 로그에 나타납니다. Annotation processor stats: 다음에 각 어노테이션 프로세서의 실행 시간에 대한 통계가 표시됩니다. 이후에 Generated files report: 다음에 각 어노테이션 프로세서의 생성된 파일 수에 대한 통계가 표시됩니다. 예를 들면:

[INFO] Annotation processor stats:
[INFO] org.mapstruct.ap.MappingProcessor: total: 290 ms, init: 1 ms, 3 round(s): 289 ms, 0 ms, 0 ms
[INFO] Generated files report:
[INFO] org.mapstruct.ap.MappingProcessor: total sources: 2, sources per round: 2, 0, 0


이 YouTrack 티켓에서 피드백을 남겨주세요.


kotlin.compiler.execution.strategy 시스템 속성의 폐지


Kotlin 1.6.20에서는 Kotlin 컴파일러 실행 전략을 정의하는 새로운 속성을 소개했습니다. Kotlin 1.7.0에서는 이전 시스템 속성 kotlin.compiler.execution.strategy에 대한 폐기 주기가 시작되었습니다. 이 시스템 속성을 사용하면 경고 메시지가 표시됩니다. 이 속성은 향후 릴리스에서 제거될 예정입니다. 이전 동작을 유지하려면 동일한 이름의 Gradle 속성으로 시스템 속성을 대체하세요. 예를 들어 gradle.properties에서 다음과 같이 설정할 수 있습니다:

 

kotlin.compiler.execution.strategy=out-of-process


Gradle 페이지에서 자세한 내용을 확인하세요.


폐기된 옵션, 메서드 및 플러그인의 제거


useExperimentalAnnotation 메서드의 폐기


Kotlin 1.7.0에서는 useExperimentalAnnotation Gradle 메서드에 대한 폐기 주기를 완료했습니다. 모듈에서 API를 사용하려면 optIn()을 사용하세요.

예를 들어 Gradle 모듈이 멀티플랫폼인 경우:

 

sourceSets {
    all {
        languageSettings.optIn("org.mylibrary.OptInAnnotation")
    }
}


Kotlin에서 opt-in 요구 사항에 대한 자세한 내용을 확인하세요.


폐기된 컴파일러 옵션 제거


다음과 같은 여러 컴파일러 옵션에 대한 폐기 주기를 완료했습니다:

  • kotlinOptions.jdkHome 컴파일러 옵션은 1.5.30에서 폐기되었으며 현재 릴리스에서 제거되었습니다. 이 옵션을 포함한 Gradle 빌드는 실패합니다. Kotlin 1.5.30부터 지원되는 Java toolchains을 사용하도록 권장합니다.
  • 폐기된 noStdlib 컴파일러 옵션도 제거되었습니다. Gradle 플러그인은 kotlin.stdlib.default.dependency=true 속성을 사용하여 Kotlin 표준 라이브러리의 존재 여부를 제어합니다.

 

컴파일러 인수 -jdkHome 및 -no-stdlib는 여전히 사용 가능합니다.

 

폐기된 플러그인의 제거


Kotlin 1.4.0에서는 kotlin2js 및 kotlin-dce-plugin 플러그인이 폐기되었으며 이 릴리스에서 제거되었습니다. kotlin2js 대신에 org.jetbrains.kotlin.js 플러그인을 사용하세요. Kotlin/JS Gradle 플러그인이 올바르게 구성되었을 때 Dead Code Elimination (DCE)이 작동합니다.

Kotlin 1.6.0에서는 KotlinGradleSubplugin 클래스의 폐기 수준을 ERROR로 변경했습니다. 개발자들은 이 클래스를 컴파일러 플러그인 작성에 사용했습니다. 이 릴리스에서 이 클래스가 제거되었습니다. 대신 KotlinCompilerPluginSupportPlugin 클래스를 사용하세요.

프로젝트 전체에서 Kotlin 플러그인 버전 1.7.0 이상을 사용하는 것이 가장 좋은 실천 방법입니다.


폐기된 코루틴 DSL 옵션 및 속성의 제거


폐기된 kotlin.experimental.coroutines Gradle DSL 옵션과 gradle.properties에서 사용된 kotlin.coroutines 속성을 제거했습니다. 이제 서스펜딩 함수를 사용하거나 빌드 스크립트에 kotlinx.coroutines 종속성을 추가할 수 있습니다.

코루틴에 대한 자세한 내용은 코루틴 가이드를 확인하세요.

 

도구체인 확장 메서드의 형 변환 제거


Kotlin 1.7.0 이전에는 Kotlin DSL로 Gradle 도구체인을 구성할 때 JavaToolchainSpec 클래스로 형 변환을 수행해야 했습니다:

 

kotlin {
    jvmToolchain {
        (this as JavaToolchainSpec).languageVersion.set(JavaLanguageVersion.of(<MAJOR_JDK_VERSION>)
    }
}


이제 (this as JavaToolchainSpec) 부분을 생략할 수 있습니다:

 

kotlin {
    jvmToolchain {
        languageVersion.set(JavaLanguageVersion.of(<MAJOR_JDK_VERSION>)
    }
}


이제 Kotlin 1.7.0에서 추가된 변경 사항에 대한 설명이었습니다. 이러한 변경 사항을 고려하여 Kotlin 프로젝트를 업그레이드하고 개발을 진행하실 수 있을 것입니다.

 

Kotlin 1.7.0로 마이그레이션


Kotlin 1.7.0을 설치하세요


IntelliJ IDEA 2022.1 및 Android Studio Chipmunk (212)는 Kotlin 플러그인을 자동으로 1.7.0으로 업데이트하도록 제안합니다.

IntelliJ IDEA 2022.2 및 Android Studio Dolphin (213) 또는 Android Studio Electric Eel (221)의 경우 Kotlin 플러그인 1.7.0은 곧 나올 IntelliJ IDEA 및 Android Studios 업데이트와 함께 제공됩니다.

새로운 명령줄 컴파일러는 GitHub 릴리스 페이지에서 다운로드할 수 있습니다.

 

기존 프로젝트를 Kotlin 1.7.0으로 마이그레이션하거나 새 프로젝트 시작

 

  • 기존 프로젝트를 Kotlin 1.7.0으로 마이그레이션하려면 Kotlin 버전을 1.7.0으로 변경하고 Gradle 또는 Maven 프로젝트를 다시 가져오세요. Kotlin 1.7.0으로 업데이트하는 방법에 대한 자세한 내용은 Kotlin 1.7.0으로 업데이트하는 방법을 확인하세요.
  • Kotlin 1.7.0으로 새 프로젝트를 시작하려면 Kotlin 플러그인을 업데이트하고 파일 | 새로 만들기 | 프로젝트에서 프로젝트 마법사를 실행하세요.

 

Kotlin 1.7.0의 호환성 가이드


Kotlin 1.7.0은 기능 릴리스이므로 이전 버전의 언어에 작성된 코드와 호환되지 않을 수 있는 변경 사항을 가져올 수 있습니다. Kotlin 1.7.0의 호환성 가이드에서 해당 변경 사항의 자세한 목록을 찾을 수 있습니다.

 

원문

 

https://kotlinlang.org/docs/whatsnew17.html#migrating-to-kotlin-1-7-0

반응형

댓글