2021년 6월 24일
Kotlin 1.5.20에는 1.5.0의 새로운 기능에서 발견된 문제에 대한 수정사항과 다양한 툴링 개선 사항이 포함되어 있습니다.
릴리스 블로그 포스트와 이 비디오에서 변경 사항에 대한 개요를 찾을 수 있습니다:
Kotlin/JVM
Kotlin 1.5.20은 JVM 플랫폼에서 다음과 같은 업데이트를 받습니다:
- invokedynamic를 통한 문자열 연결
- JSpecify 널 어노테이션 지원
- Kotlin 및 Java 코드가 있는 모듈 내에서 Java의 Lombok 생성된 메서드 호출 지원
invokedynamic를 통한 문자열 연결
Kotlin 1.5.20은 문자열 연결을 동적 호출(invokedynamic)로 JVM 9+ 대상에 컴파일하여 현대적인 Java 버전과 함께 동작합니다. 더 정확히는 문자열 연결에 대해 StringConcatFactory.makeConcatWithConstants()를 사용합니다.
이전 버전에서 사용된 StringBuilder.append()를 통한 연결로 돌아가려면 컴파일러 옵션 -Xstring-concat=inline을 추가하십시오.
Gradle, Maven 및 명령 줄 컴파일러에서 컴파일러 옵션을 추가하는 방법을 알아보려면 링크를 확인하세요.
JSpecify 널 어노테이션 지원
Kotlin 컴파일러는 다양한 유형의 널 어노테이션을 읽어 Java에서 Kotlin으로 널성 정보를 전달할 수 있습니다. 버전 1.5.20에서는 표준 통합된 Java 널 어노테이션 세트를 포함하는 JSpecify 프로젝트를 지원합니다.
JSpecify를 사용하면 Kotlin이 Java와의 널 안전성을 유지하도록 더 자세한 널성 정보를 제공할 수 있습니다. 선언, 패키지 또는 모듈 범위에서 기본 널성을 설정하고 매개 변수 널성을 지정할 수 있습니다. 자세한 내용은 JSpecify 사용자 가이드에서 확인할 수 있습니다.
다음은 Kotlin이 JSpecify 어노테이션을 처리하는 예입니다:
// JavaClass.java
import org.jspecify.nullness.*;
@NullMarked
public class JavaClass {
public String notNullableString() { return ""; }
public @Nullable String nullableString() { return ""; }
}
// Test.kt
fun kotlinFun() = with(JavaClass()) {
notNullableString().length // OK
nullableString().length // Warning: 리시버 널 가능성 불일치
}
1.5.20에서 JSpecify에서 제공하는 널성 정보에 따라 모든 널성 불일치가 경고로 보고됩니다. JSpecify와 함께 작업할 때 엄격 모드(오류 보고)를 활성화하려면 컴파일러 옵션 -Xjspecify-annotations=strict 및 -Xtype-enhancement-improvements-strict-mode를 사용하세요. JSpecify 프로젝트는 활발하게 개발 중이며 API 및 구현은 언제든지 크게 변경될 수 있습니다.
널 안전성 및 플랫폼 타입에 대해 더 알아보세요.
Kotlin 및 Java 코드가 있는 모듈 내에서 Java의 Lombok 생성된 메서드 호출 지원
Lombok 컴파일러 플러그인은 실험적입니다. 언제든지 삭제 또는 변경될 수 있습니다. 평가 목적으로만 사용하십시오. Lombok을 사용하는 경험에 대한 피드백을 환영합니다.
Kotlin 1.5.20은 실험적인 Lombok 컴파일러 플러그인을 소개합니다. 이 플러그인을 사용하면 Kotlin과 Java 코드가 있는 모듈 내에서 Java의 Lombok 선언을 생성하고 사용할 수 있습니다. Lombok 어노테이션은 Java 소스에서만 작동하며 Kotlin 코드에서 사용하면 무시됩니다.
이 플러그인은 다음 어노테이션을 지원합니다:
- @Getter, @Setter
- @NoArgsConstructor, @RequiredArgsConstructor, 및 @AllArgsConstructor
- @Data
- @With
- @Value
우리는 이 플러그인을 계속 개발 중입니다. 현재 상태에 대한 자세한 내용은 Lombok 컴파일러 플러그인 README를 확인하세요.
현재 @Builder 어노테이션을 지원할 계획은 없습니다. 그러나 YouTrack에서 @Builder에 투표하면 고려할 수 있습니다.
Lombok 컴파일러 플러그인을 구성하는 방법에 대한 자세한 내용을 알아보려면 링크를 확인하세요.
Kotlin/Native
Kotlin/Native 1.5.20은 새로운 기능과 툴링 개선 사항의 미리보기를 제공합니다:
- KDoc 주석을 생성된 Objective-C 헤더로 내보내는 옵트인
- 컴파일러 버그 수정
- 하나의 배열 내에서 Array.copyInto()의 성능 향상
KDoc 주석을 생성된 Objective-C 헤더로 내보내는 옵트인
KDoc 주석을 생성된 Objective-C 헤더로 내보내는 기능은 실험적입니다. 언제든지 삭제 또는 변경될 수 있습니다. 옵트인이 필요하며 (아래의 세부 내용 참조), 평가 목적으로만 사용해야 합니다. YouTrack에서 피드백을 주시면 감사하겠습니다.
이제 Kotlin/Native 컴파일러를 설정하여 Kotlin 코드에서 생성된 Objective-C 프레임워크로 문서 주석 (KDoc)을 내보낼 수 있으며, 이를 프레임워크의 소비자에게 표시할 수 있습니다.
예를 들어 다음 Kotlin 코드와 KDoc을 사용하는 경우:
/**
* 인수들의 합을 출력합니다.
* 합이 32비트 정수로 맞지 않는 경우를 올바르게 처리합니다.
*/
fun printSum(a: Int, b: Int) = println(a.toLong() + b)
다음과 같은 Objective-C 헤더가 생성됩니다:
/**
* 인수들의 합을 출력합니다.
* 합이 32비트 정수로 맞지 않는 경우를 올바르게 처리합니다.
*/
+ (void)printSumA:(int32_t)a b:(int32_t)b __attribute__((swift_name("printSum(a:b:)")));
Swift와도 잘 작동합니다.
KDoc 주석을 Objective-C 헤더로 내보내는 기능을 시험해보려면 -Xexport-kdoc 컴파일러 옵션을 사용하세요. 다음과 같이 build.gradle(.kts)에 다음 줄을 추가하여 주석을 내보내려는 Gradle 프로젝트의 Kotlin에서 사용하세요:
kotlin {
targets.withType<org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget> {
compilations.get("main").kotlinOptions.freeCompilerArgs += "-Xexport-kdoc"
}
}
이 YouTrack 티켓을 사용하여 피드백을 공유해 주시면 감사하겠습니다.
컴파일러 버그 수정
Kotlin/Native 컴파일러는 1.5.20에서 여러 버그 수정을 받았습니다. 변경 로그에서 완전한 목록을 찾을 수 있습니다.
호환성에 영향을 미치는 중요한 버그 수정이 있습니다. 이전 버전에서 잘못된 UTF 대리 쌍을 포함하는 문자열 상수는 컴파일 중에 값이 손실되었습니다. 이제 이러한 값은 보존됩니다. 응용 프로그램 개발자는 안전하게 1.5.20으로 업데이트할 수 있습니다. 그러나 1.5.20으로 컴파일된 라이브러리는 이전 컴파일러 버전과 호환되지 않습니다. 자세한 내용은 이 YouTrack 이슈를 참조하세요.
하나의 배열 내에서 Array.copyInto()의 성능이 향상
하나의 배열 내에서 Array.copyInto() 작업 방식을 개선했습니다. 이제 소스와 대상이 동일한 배열인 경우 이러한 작업이 최대 20 배 빨라집니다 (복사되는 객체 수에 따라 다름) 이 경우 메모리 관리 최적화로 인해.
Kotlin/JS
1.5.20 버전에서는 Kotlin/JS의 새로운 IR 기반 백엔드로 프로젝트를 이전하는 데 도움이 되는 가이드를 게시합니다.
JS IR 백엔드용 마이그레이션 가이드
JS IR 백엔드용 새 마이그레이션 가이드는 마이그레이션 중에 마주칠 수 있는 문제를 식별하고 이에 대한 해결책을 제공합니다. 가이드에서 다루지 않는 문제를 발견하면 이슈 트래커에 보고해 주시기 바랍니다.
Gradle
Kotlin 1.5.20은 Gradle 경험을 개선할 수 있는 다음과 같은 기능을 소개합니다:
- kapt에서 어노테이션 프로세서 클래스로더의 캐싱
- kotlin.parallel.tasks.in.project 빌드 속성의 폐지
kapt에서 어노테이션 프로세서 클래스로더의 캐싱
kapt에서 어노테이션 프로세서 클래스로더의 캐싱은 실험적입니다. 언제든지 삭제 또는 변경될 수 있습니다. 이를 평가 목적으로만 사용하십시오. YouTrack에서 피드백을 주시면 감사하겠습니다.
이제 kapt에서 어노테이션 프로세서 클래스로더를 캐싱할 수 있는 새로운 실험적 기능이 있습니다. 이 기능은 Gradle 실행 간에 kapt의 속도를 높일 수 있습니다.
이 기능을 활성화하려면 gradle.properties 파일에서 다음 속성을 사용하십시오:
양수 값은 캐싱을 활성화합니다
kapt를 사용하는 모듈 수와 동일한 값을 사용하세요
kapt.classloaders.cache.size=5
캐싱을 위해 비활성화하세요
kapt.include.compile.classpath=false
kapt에 대한 자세한 내용을 알아보려면 링크를 확인하세요.
kotlin.parallel.tasks.in.project 빌드 속성의 폐지
이 릴리스에서 Kotlin 병렬 컴파일은 Gradle 병렬 실행 플래그 --parallel에 의해 제어됩니다. 이 플래그를 사용하면 Gradle은 작업을 동시에 실행하여 작업을 더 빨리 컴파일하고 리소스를 효율적으로 활용합니다.
더 이상 kotlin.parallel.tasks.in.project 속성을 사용할 필요가 없습니다. 이 속성은 폐지되며 다음 주요 릴리스에서 제거될 것입니다.
표준 라이브러리
Kotlin 1.5.20에서는 문자와 관련된 여러 함수의 플랫폼별 구현을 변경하여 플랫폼 간 통일성을 제공합니다:
- Kotlin/Native 및 Kotlin/JS에서 Char.digitToInt()에서 모든 유니코드 숫자 지원
- 플랫폼 간 Char.isLowerCase()/isUpperCase() 구현 통일
Kotlin/Native 및 Kotlin/JS에서 Char.digitToInt()에서 모든 유니코드 숫자 지원
Char.digitToInt() 함수는 문자가 나타내는 10진수 숫자의 숫자 값 반환합니다. 1.5.20 이전에는 이 함수가 Kotlin/JVM에서만 모든 유니코드 숫자 문자를 지원했으며, Native 및 JS 플랫폼에서는 ASCII 숫자만 지원했습니다.
이제 Kotlin/Native 및 Kotlin/JS에서도 Char.digitToInt()를 사용하여 어떤 유니코드 숫자 문자든 호출하고 해당 숫자 표현을 얻을 수 있습니다.
val ten = '\u0661'.digitToInt() + '\u0039'.digitToInt() // 아랍-인디안 숫자 1 + 숫자 9
println(ten)
플랫폼 간 Char.isLowerCase()/isUpperCase() 구현 통일
Char.isUpperCase() 및 Char.isLowerCase() 함수는 문자의 대소문자에 따라 부울 값을 반환합니다. Kotlin/JVM의 경우, 이 구현은 General_Category와 Other_Uppercase/Other_Lowercase 유니코드 속성을 모두 확인합니다.
1.5.20 이전에 다른 플랫폼용 구현은 다르게 작동하며 일반 카테고리만 고려했습니다. 1.5.20에서는 구현이 플랫폼 간으로 통일되어 문자의 대소문자를 결정하기 위해 두 속성을 모두 사용합니다.
val latinCapitalA = 'A' // "Lu" 일반 카테고리를 가짐
val circledLatinCapitalA = 'Ⓐ' // "Other_Uppercase" 속성을 가짐
println(latinCapitalA.isUpperCase() && circledLatinCapitalA.isUpperCase())
원문
'Kotlin > What's new' 카테고리의 다른 글
[Kotlin 번역] What's new in Kotlin 1.6.0 (2) | 2023.09.17 |
---|---|
[Kotlin 번역] What's new in Kotlin 1.5.30 (2) | 2023.09.17 |
[Kotlin 번역] What's new in Kotlin 1.5.0 (1) | 2023.09.16 |
[Kotlin 번역] What's new in Kotlin 1.4.30 (42) | 2023.09.16 |
[Kotlin 번역] What's new in Kotlin 1.4.20 (3) | 2023.09.16 |
댓글