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

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

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

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())

 

원문

 

https://kotlinlang.org/docs/whatsnew1520.html#unification-of-char-islowercase-isuppercase-implementations-across-platforms

반응형

댓글