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

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

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

2021년 2월 3일

 

Kotlin 1.4.30는 새로운 언어 기능의 미리 보기 버전을 제공하며, Kotlin/JVM 컴파일러의 새로운 IR 백엔드를 베타로 업그레이드하고 성능 및 기능 개선 사항을 제공합니다.

또한 이 블로그 게시물에서 새로운 기능에 대해 알아볼 수 있습니다.


언어 기능


Kotlin 1.5.0은 JVM 레코드 지원, 실드 인터페이스 및 안정적인 인라인 클래스와 같은 새로운 언어 기능을 제공할 예정입니다. Kotlin 1.4.30에서는 이러한 기능과 개선 사항을 미리 보기 모드에서 시도해 볼 수 있습니다. 이를 위해 해당 YouTrack 티켓에서 피드백을 공유해 주시면 1.5.0 릴리스 이전에 문제를 해결하는 데 도움이 될 것입니다.

  • JVM 레코드 지원
  • 실드 인터페이스 및 실드 클래스 개선 사항
  • 개선된 인라인 클래스


이러한 언어 기능과 개선 사항을 미리 보기 모드에서 활성화하려면 특정 컴파일러 옵션을 추가해야 합니다. 자세한 내용은 아래 섹션을 참조하십시오.

새로운 기능에 대한 미리 보기 자세히 알아보기.


JVM 레코드 지원


JVM 레코드 기능은 실험적입니다. 언제든지 폐기되거나 변경될 수 있습니다. 이를 활성화하려면 (아래의 세부 정보 참조) 옵트인이 필요하며 평가 목적으로만 사용해야 합니다. YouTrack에서 피드백을 주시면 감사하겠습니다.

JDK 16 릴리스에는 record라는 새로운 Java 클래스 유형을 안정화할 계획이 있습니다. Kotlin은 Java와의 상호 운용성을 유지하면서 Kotlin의 모든 이점을 제공하기 위해 실험적인 레코드 클래스 지원을 도입하고 있습니다.

Kotlin에서는 Java에서 선언된 레코드 클래스를 Kotlin의 프로퍼티가 있는 클래스와 같은 방식으로 사용할 수 있습니다. 추가 단계는 필요하지 않습니다.

1.4.30 버전부터 코틀린에서 다음과 같이 데이터 클래스에 @JvmRecord 주석을 추가하여 레코드 클래스를 선언할 수 있습니다:

@JvmRecord
data class User(val name: String, val age: Int)


JVM 레코드의 미리 보기 버전을 시도하려면 컴파일러 옵션으로 -Xjvm-enable-preview와 -language-version 1.5를 추가하십시오.

우리는 여전히 JVM 레코드 지원을 개선하고 있으며, 이 YouTrack 티켓을 통해 피드백을 주시면 감사하겠습니다.

구현, 제약 사항 및 구문에 대한 자세한 내용은 KEEP에서 알아보십시오.

 

실드 인터페이스


실드 인터페이스는 실험적입니다. 언제든지 폐기되거나 변경될 수 있습니다. 이를 활성화하려면 (아래의 세부 정보 참조) 옵트인이 필요하며 평가 목적으로만 사용해야 합니다. YouTrack에서 피드백을 주시면 감사하겠습니다.

1.4.30 버전에서는 실험용 실드 인터페이스 프로토타입을 제공합니다. 이는 실드 클래스를 보완하고 더 유연한 제한된 클래스 계층 구조를 구축할 수 있게 해줍니다.

실드 인터페이스는 동일한 모듈 외부에서 구현할 수 없는 "내부" 인터페이스로 작동할 수 있습니다. 이러한 사실을 활용하여 예를 들어 완전한 when 표현식을 작성할 수 있습니다.

sealed interface Polygon

class Rectangle() : Polygon
class Triangle() : Polygon

// when() is exhaustive: no other polygon implementations can appear
// after the module is compiled
fun draw(polygon: Polygon) = when (polygon) {
    is Rectangle -> // ...
    is Triangle -> // ...
}


다른 사용 사례로 실드 인터페이스를 사용하여 하나 이상의 실드 슈퍼 클래스에서 클래스를 상속할 수 있습니다.

sealed interface Fillable {
    fun fill()
}
sealed interface Polygon {
    val vertices: List<Point>
}

class Rectangle(override val vertices: List<Point>) : Fillable, Polygon {
    override fun fill() { /*...*/ }
}


실드 인터페이스의 미리 보기 버전을 시도하려면 컴파일러 옵션으로 -language-version 1.5를 추가하십시오. 이 버전으로 전환하면 인터페이스에 실드 수식어를 사용할 수 있습니다. 이 YouTrack 티켓을 통해 피드백을 주시면 감사하겠습니다.

실드 인터페이스에 대해 더 자세히 알아보십시오.


패키지 전체 실드 클래스 계층 구조


패키지 전체 실드 클래스 계층 구조는 실험적입니다. 언제든지 폐기되거나 변경될 수 있습니다. 이를 활성화하

려면 (아래의 세부 정보 참조) 옵트인이 필요하며 평가 목적으로만 사용해야 합니다. YouTrack에서 피드백을 주시면 감사하겠습니다.

실드 클래스는 이제 더 유연한 계층 구조를 형성할 수 있습니다. 동일한 컴파일 유닛 및 패키지의 모든 파일에서 하위 클래스를 가질 수 있습니다. 이전에는 모든 하위 클래스가 동일한 파일에 나타나야 했습니다.

직접적인 하위 클래스는 최상위 레벨 또는 다른 명명된 클래스, 명명된 인터페이스 또는 명명된 객체 내에 중첩될 수 있습니다. 실드 클래스의 하위 클래스는 적절하게 자격 부여된 이름을 가져야 하며 로컬 또는 익명 객체가 될 수 없습니다.

패키지 전체 실드 클래스 계층 구조를 시도하려면 컴파일러 옵션으로 -language-version 1.5를 추가하십시오. 이 YouTrack 티켓을 통해 피드백을 주시면 감사하겠습니다.

패키지 전체 실드 클래스 계층 구조에 대해 더 자세히 알아보십시오.


개선된 인라인 클래스


인라인 값 클래스는 베타 버전입니다. 거의 안정적이지만 향후에는 이식 단계가 필요할 수 있습니다. 가능한 변경 사항을 최소화하기 위해 최선을 다하겠습니다. 인라인 클래스 기능에 대한 피드백을 감사히 받겠습니다.

Kotlin 1.4.30에서는 인라인 클래스를 베타로 승격하고 다음과 같은 기능 및 개선 사항을 제공합니다:

- 인라인 클래스는 값 기반이므로 값을 수정하는 value 수정자를 사용하여 정의할 수 있습니다. 인라인 및 value 수정자는 현재 서로 동등합니다. 향후 Kotlin 버전에서는 인라인 수정자를 폐기할 예정입니다.

이제 Kotlin은 JVM 백엔드의 클래스 선언 앞에 @JvmInline 주석을 요구합니다:

inline class Name(private val s: String)

value class Name(private val s: String)

// For JVM backends
@JvmInline
value class Name(private val s: String)


- 인라인 클래스에 init 블록을 추가할 수 있습니다. 클래스가 인스턴스화된 직후에 실행될 코드를 추가할 수 있습니다:

@JvmInline
value class Negative(val x: Int) {
  init {
      require(x < 0) { }
  }
}


- 인라인 클래스를 사용하는 함수를 Java 코드에서 호출하는 경우: Kotlin 1.4.30 이전에는 맹글링으로 인해 Java에서 인라인 클래스를 수용하는 함수를 호출할 수 없었습니다. 이제 맹글링을 수동으로 비활성화할 수 있습니다. Java 코드에서 이러한 함수를 호출하려면 함수 선언 앞에 @JvmName 주석을 추가해야 합니다:

inline class UInt(val x: Int)

fun compute(x: Int) { }

@JvmName("computeUInt")
fun compute(x: UInt) { }


- 이 릴리스에서는 함수의 맹글링 방식을 수정하여 잘못된 동작을 수정했습니다. 이러한 변경 사항으로 ABI 변경이 발생했습니다.

1.4.30부터 Kotlin 컴파일러는 기본적으로 새 맹글링 방식을 사용합니다. 이전 1.4.0 맹글링 방식을 사용하고 이진 호환성을 유지하려면 -Xuse-14-inline-classes-mangling-scheme 컴파일러 플래그를 사용하십시오.

Kotlin 1.4.30은 인라인 클래스를 베타로 승격하며 향후 릴리스에서는 안정적으로 만들 계획입니다. 이 YouTrack 티켓을 통해 피드백을 주시면 감사하겠습니다.

인라인 클래스의 미리 보기 버전을 시도하려면 컴파일러 옵션으로 -Xinline-classes 또는 -language-version 1.5를 추가하십시오.

맹글링 알고리즘에 대해 자세히 알아보려면 KEEP에서 알아보십시오.

인라인 클래스에 대해 더 자세히 알아보십시오.

 

Kotlin/JVM


JVM IR 컴파일러 백엔드가 베타 버전으로 도달했습니다.


Kotlin/JVM을 위한 IR 기반 컴파일러 백엔드는 1.4.0에서 알파 버전으로 소개되었으며 이제 베타 버전에 도달했습니다. 이것은 IR 백엔드가 Kotlin/JVM 컴파일러의 기본으로 사용되기 전의 마지막 안정화되지 않은 단계입니다.

우리는 이제 IR 컴파일러에서 생성된 이진 파일을 사용하는 제한을 해제하고 있습니다. 이전에는 새로운 JVM IR 백엔드를 활성화하지 않았다면 새로운 백엔드로 컴파일된 코드를 사용할 수 없었습니다. 1.4.30부터는 이러한 제한이 없으므로 새로운 백엔드를 사용하여 라이브러리와 같은 제3자용 컴포넌트를 빌드할 수 있습니다. 새로운 백엔드의 베타 버전을 시도하고 우리의 이슈 트래커에서 피드백을 공유해 주세요.

새로운 JVM IR 백엔드를 활성화하려면 프로젝트의 구성 파일에 다음 라인을 추가하십시오:

- Gradle에서:

 

tasks.withType(org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompile::class) {
  kotlinOptions.useIR = true
}


- Maven에서:

 

<configuration>
    <args>
        <arg>-Xuse-ir</arg>
    </args>
</configuration>



JVM IR 백엔드가 가져오는 변경 사항에 대해 더 알아보려면 이 블로그 게시물을 확인하십시오.

 

Kotlin/Native


성능 향상


Kotlin/Native는 1.4.30에서 다양한 성능 향상을 받아 더 빠른 컴파일 시간을 선사했습니다. 예를 들어, Kotlin Multiplatform Mobile 샘플의 Networking 및 데이터 저장소에서 프레임워크를 재빌드하는 데 필요한 시간이 1.4.10에서 9.5초에서 1.4.30에서 4.5초로 감소했습니다.


Apple watchOS 64-bit 시뮬레이터 대상


x86 시뮬레이터 대상은 watchOS의 7.0 버전부터 사용되지 않습니다. Kotlin/Native는 64-bit 아키텍처에서 시뮬레이터를 실행하기 위한 watchosX64 새 대상을 제공합니다.


Xcode 12.2 라이브러리 지원


Xcode 12.2와 함께 제공되는 새 라이브러리를 지원하도록 추가했습니다. 이제 Kotlin 코드에서 이러한 라이브러리를 사용할 수 있습니다.


Kotlin/JS


최상위 프로퍼티의 게으른 초기화


최상위 프로퍼티의 게으른 초기화는 실험적입니다. 언제든지 폐기되거나 변경될 수 있습니다. 이를 활성화하려면 (아래의 세부 정보 참조) 옵트인이 필요하며 평가 목적으로만 사용해야 합니다. 이에 대한 피드백을 YouTrack에서 공유해 주시면 감사하겠습니다.

Kotlin/JS의 IR 백엔드는 최상위 프로퍼티에 대한 게으른 초기화의 프로토타입 구현을 받고 있습니다. 이것은 응용 프로그램이 시작될 때 모든 최상위 프로퍼티를 초기화해야 하는 필요를 줄이며 응용 프로그램 시작 시간을 크게 개선해야 합니다.

게으른 초기화에 대해 계속 작업할 것이며 현재의 프로토타입을 시도하고 이 YouTrack 티켓 또는 공식 Kotlin Slack의 #javascript 채널에서 생각과 결과를 공유해 주시기를 부탁드립니다. 게으른 초기화를 사용하려면 JS IR 컴파일러로 코드를 컴파일할 때 -Xir-property-lazy-initialization 컴파일러 옵션을 추가하십시오.


Gradle 프로젝트 개선


Gradle 구성 캐시 지원


1.4.30부터 Kotlin Gradle 플러그인은 구성 캐시 기능을 지원합니다. 이는 빌드 프로세스를 가속화합니다. 명령을 실행하면 Gradle은 구성 단계를 실행하고 작업 그래프를 계산합니다. Gradle은 결과를 캐시하고 이를 후속 빌드에서 재사용합니다.

이 기능을 사용하려면 Gradle 명령을 사용하거나 IntelliJ 기반 IDE를 설정할 수 있습니다.

 

표준 라이브러리


로캘에 독립적인 텍스트 대소문자 변환을 위한 API


로캘에 독립적인 API 기능은 실험적입니다. 언제든지 폐기되거나 변경될 수 있습니다. 이를 평가 목적으로만 사용하십시오. 이에 대한 피드백을 YouTrack에서 주시면 감사하겠습니다.

이 릴리스에서는 문자열 및 문자의 대소문자를 변경하기 위한 실험적인 로캘에 독립적인 API를 도입합니다. 현재의 toLowerCase(), toUpperCase(), capitalize(), decapitalize() API 함수는 로캘에 민감합니다. 즉, 다른 플랫폼 로캘 설정이 코드 동작에 영향을 미칠 수 있습니다. 예를 들어, 터키 로캘에서 문자열 "kotlin"을 toUpperCase로 변환하면 결과가 "KOTLİN"이 아니라 "KOTLIN"이 됩니다.

 

// 현재 API
println("Needs to be capitalized".toUpperCase()) // NEEDS TO BE CAPITALIZED

// 새로운 API
println("Needs to be capitalized".uppercase()) // NEEDS TO BE CAPITALIZED


Kotlin 1.4.30은 다음과 같은 대안을 제공합니다:

문자열 함수에 대한 이전 버전과 1.4.30 대체품:

 

문자 함수에 대한 이전 버전과 1.4.30 대체품:

 


Kotlin/JVM에서는 명시적인 로캘 매개변수와 함께 오버로드된 uppercase(), lowercase() 및 titlecase() 함수도 제공합니다.

텍스트 처리 함수에 대한 전체 변경 목록은 KEEP에서 확인하십시오.


문자를 코드 및 숫자로 명확하게 변환


문자 변환 기능에 대한 명확한 API는 실험적입니다. 언제든지 폐기되거나 변경될 수 있습니다. 이를 평가 목적으로만 사용하십시오. 이에 대한 피드백을 YouTrack에서 주시면 감사하겠습니다.

현재 Char를 숫자로 변환하는 함수는 서로 다른 숫자 유형으로 표현된 UTF-16 코드를 반환하며 종종 문자열을 숫자 값으로 반환하는 유사한 String-to-Int 변환과 혼동됩니다.

 

"4".toInt() // 4를 반환
'4'.toInt() // 52를 반환
// 그리고 Char '4'에 대해 숫자 값 4를 반환하는 공통 함수가 없었습니다.


이러한 혼란을 피하기 위해 Char 변환을 다음과 같이 두 가지 명확하게 명명된 함수 세트로 분리하기로 결정했습니다:

- Char의 정수 코드를 가져오고 주어진 코드에서 Char를 구성하는 함수:

 

fun Char(code: Int): Char
fun Char(code: UShort): Char
val Char.code: Int


- Char를 나타내는 숫자 값으로 Char를 변환하는 함수:

 

fun Char.digitToInt(radix: Int): Int
fun Char.digitToIntOrNull(radix: Int): Int?


- Int를 나타내는 비음수 단일 숫자를 해당하는 Char 표현으로 변환하는 Int에 대한 확장 함수:

fun Int.digitToChar(radix: Int

 

자세한 건 KEEP에서 확인하세요.

 

직렬화 업데이트


Kotlin 1.4.30과 함께, 우리는 몇 가지 새로운 기능을 포함한 kotlinx.serialization 1.1.0-RC를 출시하고 있습니다.

 

  • 인라인 클래스 직렬화 지원
  • 부호 없는 원시 유형 직렬화 지원

 

인라인 클래스 직렬화 지원


Kotlin 1.4.30부터 인라인 클래스를 직렬화할 수 있습니다:

@Serializable
inline class Color(val rgb: Int)


이 기능은 새로운 1.4.30 IR 컴파일러를 필요로 합니다.

직렬화 프레임워크는 직렬화 가능한 인라인 클래스가 다른 직렬화 가능한 클래스에서 사용될 때 박싱하지 않습니다.

자세한 내용은 kotlinx.serialization 문서에서 확인하세요.


부호 없는 원시 유형 직렬화 지원


1.4.30부터 kotlinx.serialization의 표준 JSON 직렬화기를 사용하여 부호 없는 원시 유형(UInt, ULong, UByte 및 UShort)에 대해 사용할 수 있습니다:

@Serializable
class Counter(val counted: UByte, val description: String)
fun main() {
   val counted = 239.toUByte()
   println(Json.encodeToString(Counter(counted, "tries")))
}


자세한 내용은 kotlinx.serialization 문서에서 확인하세요.

 

원문

 

https://kotlinlang.org/docs/whatsnew1430.html#unsigned-primitive-type-serialization-support

반응형

댓글