본문 바로가기
Kotlin/Release Notes

[Kotlin Release Notes] Kotlin 1.6.20 Released

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

2022년 4월 4일

 
Kotlin 1.6.20가 공식으로 릴리스되었습니다. 이 릴리스는 미래 언어 기능의 미리보기를 제공하며, 멀티플랫폼 프로젝트를 위한 계층 구조를 기본값으로 설정하고 JVM, JS 및 Native 플랫폼의 성능 개선을 가져왔습니다.

이 블로그 게시물에서는 다음 개선 사항 개요와 다른 진화적인 변경 사항의 완전한 목록을 찾을 수 있습니다:

  • Kotlin/JVM에서 컨텍스트 종속 선언을 정의하기 위한 새로운 지원으로, 컨텍스트 리시버 프로토타입에서 나온 것입니다.
  • 정말로 비-nullable 타입으로 인해 일반적인 Java 클래스와 인터페이스와의 상호 운용성이 향상되었습니다.
  • JVM IR 백엔드의 단일 모듈을 병렬 컴파일로 인한 빠른 빌드 시간 개선이 이루어졌습니다.
  • Kotlin/JS IR의 점진적 컴파일에 의해 간소화된 개발 경험이 제공되었습니다.
  • Kotlin/Native 성능 개선.
  • 멀티플랫폼 프로젝트의 계층 구조 덕분에 코드 공유가 더 쉬워졌습니다.

 

 

업데이트 방법


IntelliJ IDEA 또는 Android Studio를 사용하는 경우, Kotlin의 새로운 릴리스가 사용 가능해지면 자동으로 업데이트할 수 있는 옵션이 있습니다.
 

주요 업데이트


Kotlin/JVM을 위한 컨텍스트 리시버 프로토타입
Kotlin 1.6.20에서는 더 이상 하나의 리시버에 제한받지 않습니다. 더 많은 리시버가 필요한 경우, 함수, 속성 및 클래스를 컨텍스트 종속 또는 컨텍스트로 만들 수 있습니다. 컨텍스트 종속 선언은 다음과 같은 역할을 합니다:

모든 선언된 컨텍스트 리시버가 호출자의 스코프에 암시적 리시버로 존재해야 합니다.
선언된 컨텍스트 리시버를 몸체 스코프로 가져옵니다.
 

interface LoggingContext {
    val log: Logger // 이 컨텍스트는 로거에 대한 참조를 제공합니다.
}

context(LoggingContext)
fun startBusinessOperation() {
    // LoggingContext가 암시적 리시버이므로 log 속성에 액세스할 수 있습니다.
    log.info("작업이 시작되었습니다")
}

fun test(loggingContext: LoggingContext) {
    with(loggingContext) {
        // startBusinessOperation()를 호출하려면 LoggingContext를 스코프에 암시적 리시버로 가져와야 합니다.
        startBusinessOperation()
    }
}


프로젝트에서 컨텍스트 리시버를 활성화하려면 -Xcontext-receivers 컴파일러 옵션을 사용하십시오. 이 기능과 그 구문에 대한 자세한 설명은 KEEP(코틀린 진화 제안)에서 찾을 수 있습니다.

그러나 이 구현이 프로토타입임을 유의하세요:

  • -Xcontext-receivers를 활성화하면 컴파일러가 프리 릴리스 바이너리를 생성하며, 이는 프로덕션 코드에서 사용할 수 없습니다.
  • 현재로서는 컨텍스트 리시버에 대한 IDE 지원이 제한적입니다.

 

절대적으로 non-nullable 타입


Kotlin 1.6.20에서는 일반적인 Java 클래스와 인터페이스를 확장할 때 더 나은 상호 운용성을 제공하기 위해 새로운 구문 T & Any을 사용하여 사용 사이트에서 일반 유형 매개변수를 확실히 non-nullable로 표시할 수 있게 했습니다. 이 구문 형태는 교차 유형의 표기법에서 나온 것이며, 이제 왼쪽 side에 nullable 상한을 가진 유형 매개변수에만 사용할 수 있으며 &의 오른쪽 side에 non-nullable Any가 있어야 합니다:

fun <T> elvisLike(x: T, y: T & Any): T & Any = x ?: y
​
fun main() {
   // OK
   elvisLike<String>("", "").length
   // 오류: 'null'은 비-nullable 타입의 값이 될 수 없습니다.
   elvisLike<String>("", null).length
​
   // OK
   elvisLike<String?>(null, "").length
   // 오류: 'null'은 비-nullable 타입의 값이 될 수 없습니다.
   elvisLike<String?>(null, null).length
}


이 기능을 활성화하려면 언어 버전을 1.7로 설정하세요:

kotlin {
   sourceSets.all {
       languageSettings.apply {
           languageVersion = "1.7"
       }
   }
}


절대적으로 non-nullable 타입은 베타 상태입니다. 거의 안정적이지만 미래에는 이동 단계가 필요할 수 있습니다. 변경해야 할 사항을 최소화하기 위해 최선을 다하겠습니다. 이에 대한 자세한 내용은 KEEP(코틀린 진화 제안)에서 확인하십시오.


JVM 백엔드에서 단일 모듈의 병렬 컴파일을 지원

 
Kotlin 1.6.20에서는 실험적인 JVM IR 백엔드 모드를 추가하여 모듈 내의 모든 파일을 병렬로 컴파일하는 기능을 추가했습니다. 병렬 컴파일은 총 컴파일 시간을 최대 15%까지 줄일 수 있습니다.

컴파일러 옵션 -Xbackend-threads를 사용하여 실험적인 병렬 백엔드 모드를 활성화할 수 있습니다. 이 옵션에 대한 다음과 같은 인수를 사용하십시오:

  • N은 사용하려는 스레드 수와 동일합니다. CPU 코어 수보다 크지 않아야 하며, 그렇지 않으면 스레드 간의 컨텍스트 전환으로 인해 병렬화가 효과가 없어집니다.
  • 0은 각 CPU 코어에 하나의 스레드를 사용합니다.


Gradle은 작업을 병렬로 실행할 수 있지만, 이러한 유형의 병렬화는 Gradle의 관점에서 프로젝트 (또는 프로젝트의 주요 부분)가 그냥 Gradle 관점에서 하나의 큰 작업일 때 큰 도움이 되지 않습니다. 매우 큰 단일 모듈이 있는 경우 병렬 컴파일을 사용하여 더 빨리 컴파일할 수 있습니다. 프로젝트가 작은 모듈로 구성되어 있고 Gradle에 의해 병렬화된 빌드가 있는 경우 추가적인 병렬화 레이어를 추가하면 컨텍스트 전환으로 인해 성능이 저하될 수 있습니다.

병렬 컴파일에는 몇 가지 제약 사항이 있습니다:

  • kapt와 함께 작동하지 않습니다. kapt는 IR 백엔드를 비활성화합니다.
  • 더 많은 JVM 힙을 필요로 합니다. 힙의 양은 스레드 수에 비례합니다.

 

Kotlin/JS IR 컴파일러의 개발 바이너리를 위한 증분 컴파일 지원


Kotlin/JS 개발을 더 효율적으로 하기 위해 IR 컴파일러와 함께 새로운 점진적 컴파일 모드를 소개합니다.

이 모드에서는 compileDevelopmentExecutableKotlinJs Gradle 작업을 사용하여 개발용 이진 파일을 빌드할 때, 컴파일러는 모듈 레벨에서 이전 컴파일의 결과를 캐시합니다. 변경되지 않은 소스 파일에 대해서는 이후 컴파일 시에 캐시된 컴파일 결과를 사용하여 더 빨리 완료됩니다. 특히 작은 변경 사항이 있는 경우에는 빠르게 작업을 진행할 수 있습니다. 이 개선은 주로 개발 프로세스(편집-빌드-디버그 주기 단축)를 대상으로 하며 프로덕션 아티팩트 빌드에는 영향을 미치지 않습니다.

개발용 이진 파일에 대한 점진적 컴파일을 활성화하려면 프로젝트의 gradle.properties에 다음 라인을 추가하십시오:

kotlin.incremental.js.ir=true // 기본값은 false입니다.


테스트 프로젝트에서는 새로운 모드를 사용하면 점진적 컴파일이 최대 30% 더 빨라질 수 있었습니다. 그러나 이 모드에서의 클린 빌드는 캐시를 생성하고 채우는 작업 때문에 느려질 수 있다는 점을 유의하십시오.
 

Kotlin/Native 성능 개선

 
Kotlin 1.6.20에서는 LLVM IR로 생성되는 Kotlin의 성능을 개선하기 위한 몇 가지 성능 업데이트와 버그 수정이 제공됩니다. 내부 프로젝트에서의 벤치마크에 따르면 다음과 같은 성능 향상이 평균적으로 이루어졌습니다:

  • 실행 시간에서 15% 감소
  • 릴리스 및 디버그 바이너리의 코드 크기에서 20% 감소
  • 릴리스 바이너리의 컴파일 시간에서 26% 감소

 
이러한 변경 사항은 큰 내부 프로젝트에서 디버그 바이너리의 컴파일 시간을 10% 감소시키는 결과도 제공합니다.

이를 달성하기 위해 컴파일러가 생성한 일부 합성 객체에 대한 정적 초기화를 구현하고, 각 함수에 대한 LLVM IR 구조화 방식을 개선하며 컴파일러 캐시를 최적화했습니다.
 

멀티 플랫폼을 위한 계층 구조 지원

 
Kotlin 1.6.20에서는 기본적으로 활성화된 계층 구조 지원이 함께 제공됩니다. Kotlin 1.4.0에서 소개한 이후에는 frontend를 크게 개선하고 IDE 가져오기를 안정화했습니다.

이전에는 멀티플랫폼 프로젝트에 코드를 추가하는 두 가지 방법이 있었습니다. 첫 번째 방법은 플랫폼별 소스 세트에 코드를 삽입하는 것이었는데, 이는 하나의 대상(target)에만 제한되며 다른 플랫폼에서 재사용할 수 없습니다. 두 번째는 현재 Kotlin에서 지원하는 모든 플랫폼에 공유되는 공통 소스 세트를 사용하는 것이었습니다.

이제 공통 로직과 타사 API를 많이 재사용하는 여러 유사한 네이티브 대상 간에 소스 코드를 공유할 수 있습니다. 이 기술은 올바른 기본 종속성을 제공하고 공유 코드에서 사용 가능한 정확한 API를 찾아줍니다. 이렇게 하면 복잡한 빌드 설정 및 네이티브 대상 간의 소스 세트 공유를 위한 해결책 사용 없이도 IDE에서 지원을 받을 수 있게 되며 다른 대상을 위해 의도된 안전하지 않은 API 사용을 방지하는 데도 도움이 됩니다.

이 기술은 라이브러리 작성자에게도 유용할 것으로, 계층적 프로젝트 구조를 사용하면 대상의 하위 집합을 위해 공통 API를 발행하고 소비할 수 있게 됩니다.

기본적으로 계층 구조 프로젝트로 게시된 라이브러리는 계층 구조 프로젝트와 호환됩니다. 프로젝트-라이브러리 호환성에 대해 자세히 알아보세요.


프로젝트 내 코드 공유의 개선


계층 구조 지원이 없는 경우 일부 Kotlin 대상 간에 코드를 공유하는 간단한 방법이 없습니다. 일반적인 예로는 모든 iOS 대상 간에 코드를 공유하고 Foundation과 같은 iOS 특정 종속성에 액세스하는 것이 있습니다.

계층적 프로젝트 구조 지원 덕분에 이제 이것을 쉽게 수행할 수 있습니다. 새로운 구조에서 소스 세트는 계층을 형성합니다. 각 소스 세트가 컴파일되는 특정 대상에 사용 가능한 플랫폼별 언어 기능 및 종속성을 사용할 수 있습니다.

예를 들어 iOS 디바이스와 시뮬레이터를 위한 두 개의 대상 (iosArm64 및 iosX64)을 가진 전형적인 멀티플랫폼 프로젝트를 고려해보세요. Kotlin 도구는 두 대상이 동일한 기능을 가지고 있다는 것을 이해하고 중간 소스 세트 iosMain에서 해당 기능에 액세스할 수 있도록 허용합니다.
 


Kotlin 도구 체인은 Kotlin/Native stdlib 또는 네이티브 라이브러리와 같은 올바른 기본 종속성을 제공합니다. 또한 Kotlin 도구는 공유 코드에서 사용 가능한 API를 정확하게 찾아줍니다. 이렇게 하면 macOS용 함수를 Windows용으로 공유 코드에서 사용하는 경우와 같은 문제를 방지할 수 있습니다.


라이브러리 작성자에게 더 많은 기회


멀티플랫폼 라이브러리가 게시될 때 중간 소스 세트의 API가 올바르게 게시되어 소비자에게 제공됩니다. 다시 한번 강조하면 Kotlin 도구 체인은 소비자 소스 세트에서 사용 가능한 API를 자동으로 찾아줄 것이며 JVM을 위한 API를 JS 코드에서 사용하는 것과 같은 안전하지 않은 사용 사례를 주의 깊게 관찰합니다. 코드 공유에 대한 자세한 내용을 알아보세요.


구성 및 설정


Kotlin 1.6.20부터 모든 새로운 멀티플랫폼 프로젝트는 계층 구조 프로젝트 구조를 갖게 됩니다. 추가 설정은 필요하지 않습니다.

수동으로 활성화한 경우 gradle.properties에서 더 이상 사용되지 않는 옵션을 제거할 수 있습니다:
 

kotlin.mpp.enableGranularSourceSetsMetadata=true
kotlin.native.enableDependencyPropagation=true


Kotlin 1.6.20을 사용하는 경우 최상의 경험을 얻으려면 Android Studio 2021.1.1 (Bumblebee) 이상을 권장합니다.

또한 계층 구조 지원을 비활성화하려면 gradle.properties에서 다음 옵션을 설정하십시오:

kotlin.mpp.hierarchicalStructureSupport=false

 

Kotlin 1.6.20의 주요 개선 사항 목록


언어

  • Kotlin/JVM을 위한 컨텍스트 수신자 프로토타입
  • 확실히 Non-nullable 타입


Kotlin/JVM

 

  • 인터페이스를 위한 새로운 @JvmDefaultWithCompatibility 어노테이션
  • -Xjvm-default 모드에서의 호환성 변경 사항
  • JVM 백엔드에서 단일 모듈의 병렬 컴파일 지원
  • 함수 인터페이스 생성자에 대한 호출 가능 참조 지원

 

Kotlin/Native

  • 새로운 메모리 매니저에 대한 업데이트
  • 새로운 메모리 매니저의 스윕 단계를 위한 동시성 구현
  • 어노테이션 클래스의 인스턴스화
  • Swift async/await와의 상호 운용성: KotlinUnit 대신 Void 반환
  • libbacktrace를 사용한 개선된 스택 추적
  • 독립 실행 가능한 Android 실행 파일 지원
  • cinterop 모듈 가져오기 중에 개선된 오류 처리
  • Xcode 13 라이브러리 지원

 

Kotlin Multiplatform

 

  • 멀티플랫폼 프로젝트를 위한 계층 구조 지원
  • Kotlin CocoaPods Gradle 플러그인 업데이트

 

Kotlin/JS

 

  • IR 컴파일러를 사용한 개발용 바이너리의 점진적 컴파일 지원
  • IR 컴파일러를 사용한 기본적으로 상위 레벨 속성의 지연 초기화
  • IR 컴파일러를 사용한 기본적으로 프로젝트 모듈을 위한 별도의 JS 파일
  • Char 클래스 최적화
  • 내보내기 및 TypeScript 선언 생성에 대한 개선
  • 비동기 테스트를 위한 @AfterTest 보장

 

보안

 

  • klibs에서 상대 경로 사용
  • Kotlin/JS Gradle 프로젝트에서 npm 종속성의 yarn.lock 유지
  • 기본적으로 --ignore-scripts를 사용하여 npm 종속성 설치

 

Gradle

 

  • Kotlin 컴파일러 실행 전략 정의를 위한 속성
  • kapt와 코루틴을 위한 빌드 옵션의 사용 중단
  • kotlin.parallel.tasks.in.project 빌드 옵션의 제거

 

Kotlin 1.6.20을 설치하는 방법

 
IntelliJ IDEA 또는 Android Studio를 사용하는 경우 IDE가 Kotlin을 1.6.20으로 자동 업데이트 제안합니다. 수동으로 업데이트하려면 해당 지침을 따릅니다.
 
최신 버전의 이러한 IDE를 다운로드하여 Kotlin에 대한 포괄적인 지원을 얻을 수 있습니다.
 

  • IntelliJ IDEA - 다양한 플랫폼용 Kotlin 애플리케이션 개발을 위해.
  • Android Studio - Android 및 크로스 플랫폼 모바일 애플리케이션 개발을 위해.


이미 있는 프로젝트의 빌드 스크립트에서 kotlinx 라이브러리를 호환 가능한 버전으로 업데이트하고 Kotlin 버전을 1.6.20으로 지정하는 것을 잊지 마십시오.
커맨드 라인 컴파일러가 필요한 경우 Github 릴리스 페이지에서 다운로드할 수 있습니다.
 

만약 문제가 발생하면 다음과 같은 방법으로 도움을 받을 수 있습니다:

 

  • Slack에서 도움 찾기 (초대장 받기)
  • 문제를 YouTrack 이슈 트래커에 보고하기

 
Kotlin의 최신 기능을 계속해서 받아보려면 이 포스트 오른쪽에 있는 양식을 채워 Kotlin 업데이트를 받아보세요.


추가로 읽고 시청할 내용:

 

  • Kotlin 로드맵
  • Kotlin 1.6.20에서의 새로운 내용 문서
  • Kotlin 1.6의 호환성 가이드
  • Kotlin 1.6.0이 출시되었습니다!

 

원문

 
https://blog.jetbrains.com/kotlin/2022/04/kotlin-1-6-20-released/

반응형

댓글