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

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

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

2022년 9월 29일

 

Kotlin 1.7.20의 IDE 지원은 IntelliJ IDEA 2021.3, 2022.1 및 2022.2에서 사용할 수 있습니다.

Kotlin 1.7.20 릴리스가 출시되었습니다! 이 릴리스의 주요 하이라이트는 다음과 같습니다:

  • 새로운 Kotlin K2 컴파일러는 모든 오픈, 수신기가 있는 SAM 및 롬복 등 다양한 컴파일러 플러그인을 지원합니다.
  • '..<' 연산자를 사용하여 오픈 엔드 범위를 생성하는 미리보기를 도입했습니다.
  • 새로운 Kotlin/Native 메모리 매니저가 기본적으로 활성화되었습니다.
  • JVM을 위한 새로운 실험적 기능인 제네릭 기반의 인라인 클래스를 도입했습니다.


이 릴리스에 대한 변경 내용 개요는 다음 비디오에서 확인할 수도 있습니다:

 


Kotlin 1.7.20 릴리스의 Kotlin K2 컴파일러 플러그인 지원


Kotlin 팀은 K2 컴파일러를 계속 안정화하고 있습니다. K2는 여전히 Alpha 상태이지만 Kotlin 1.7.0 릴리스에서 발표된 대로 여러 컴파일러 플러그인을 지원합니다. Kotlin 팀에서 새로운 컴파일러에 대한 업데이트를 받으려면 이 YouTrack 이슈를 참고하세요.

1.7.20 릴리스부터 Kotlin K2 컴파일러는 다음 플러그인을 지원합니다:

  • all-open
  • no-arg
  • 수신기가 있는 SAM
  • 롬복
  • AtomicFU
  • jvm-abi-gen


새로운 K2 컴파일러의 Alpha 버전은 JVM 프로젝트에서만 작동합니다. Kotlin/JS, Kotlin/Native 또는 다른 멀티플랫폼 프로젝트는 지원하지 않습니다.

새로운 컴파일러 및 그 이점에 대한 자세한 내용은 다음 비디오를 참고하세요:


Kotlin K2 컴파일러를 활성화하는 방법


Kotlin K2 컴파일러를 활성화하고 테스트하려면 다음 컴파일러 옵션을 사용하세요:

 

  -Xuse-k2


이 옵션을 build.gradle(.kts) 파일에 지정할 수 있습니다:

tasks.withType<KotlinCompile> {
    kotlinOptions.useK2 = true
}


JVM 프로젝트에서의 성능 향상을 확인하고 이전 컴파일러의 결과와 비교해 보세요.


새로운 K2 컴파일러에 대한 피드백 제공


우리는 다음과 같은 모든 형태의 피드백을 매우 감사히 받습니다:

  • Kotlin Slack의 K2 개발자에게 직접 피드백 제공: 초대장을 받고 #k2-early-adopters 채널에 가입하세요.
  • 새로운 K2 컴파일러에 문제가 있었던 경우 이슈 트래커에 보고하세요.
  • 사용 통계 보내기 옵션을 활성화하여 JetBrains가 K2 사용에 관한 익명의 데이터 수집을 허용하세요.

 

언어

 

Kotlin 1.7.20은 새로운 언어 기능 미리보기 버전을 소개하며, 빌더 타입 추론에 대한 제한을 설정합니다:


오픈 엔드 범위 생성을 위한 ..< 연산자의 미리보기


새로운 연산자는 실험적이며 IDE에서 제한적인 지원을 제공합니다.

이 릴리스에서는 새로운 ..< 연산자를 소개합니다. Kotlin은 값 범위를 표현하기 위해 .. 연산자를 가지고 있습니다. 새로운 ..< 연산자는 until 함수처럼 작동하며 엔드(마지막) 값이 포함되지 않는 오픈 엔드 범위를 정의하는 데 도움을 줍니다.

 

 

이 새로운 연산자는 오픈 엔드 범위를 더 명확하게 표현하고 상한 값이 포함되지 않음을 명확하게 합니다.

다음은 when 표현식에서 ..< 연산자를 사용한 예입니다:

when (value) {
    in 0.0..<0.25 -> // 첫 번째 분기
    in 0.25..<0.5 -> // 두 번째 분기
    in 0.5..<0.75 -> // 세 번째 분기
    in 0.75..1.0 ->  // 마지막 분기  <- 여기서는 닫힌 범위임을 유의하세요
}


표준 라이브러리 API 변경


다음과 같은 새로운 유형과 작업이 표준 Kotlin 라이브러리의 kotlin.ranges 패키지에 소개됩니다:


새로운 OpenEndRange 인터페이스


  이 오픈 엔드 범위를 나타내기 위한 새로운 인터페이스는 기존의 ClosedRange<T> 인터페이스와 매우 유사합니다.

interface OpenEndRange<T : Comparable<T>> {
    // 하한 경계
    val start: T
    // 상한 경계, 범위에 포함되지 않음
    val endExclusive: T
    operator fun contains(value: T): Boolean = value >= start && value < endExclusive
    fun isEmpty(): Boolean = start >= endExclusive
}


기존 iterable 범위에서 OpenEndRange 구현


  개발자가 상한 경계를 제외한 범위를 얻어야 할 때 현재는 until 함수를 사용합니다. 이러한 범위가 OpenEndRange<T>를 사용하는 새로운 API에서 허용되도록 하기 위해 기존의 iterable 범위에서 이 인터페이스를 구현하려고 합니다. 따라서 IntRange, LongRange, CharRange, UIntRange 및 ULongRange에서 동시에 ClosedRange<T> 및 OpenEndRange<T> 인터페이스를 구현합니다.

class IntRange : IntProgression(...), ClosedRange<Int>, OpenEndRange<Int> {
    override val start: Int
    override val endInclusive: Int
    override val endExclusive: Int
}


표준 유형을 위한 rangeUntil 연산자


  rangeUntil 연산자는 현재의 rangeTo 연산자로 정의된 동일한 유형과 조합을 위해 제공됩니다. 이 연산자는 프로토타입 목적으로 확장 함수로 제공되지만 일관성을 유지하기 위해 이후에 멤버로 제공할 계획입니다.


..< 연산자를 활성화하는 방법


..< 연산자를 사용하거나 해당 연산자를 사용자 정의 유형에 구현하려면 -language-version 1.8 컴파일러 옵션을 활성화하세요. 

 

표준 유형의 오픈 엔드 범위를 지원하기 위해 도입된 새 API 요소는 실험적인 stdlib API에 일반적으로 필요한 것처럼 opt-in이 필요합니다: @OptIn(ExperimentalStdlibApi::class). 또는 -opt-in=kotlin.ExperimentalStdlibApi 컴파일러 옵션을 사용할 수도 있습니다. 

 

더 자세한 내용은 이 KEEP 문서에서 확인하세요.


데이터 객체를 사용한 싱글톤 및 sealed 클래스 계층구조의 개선된 문자열 표현


데이터 객체는 실험적이며 현재 IDE에서는 제한적인 지원만 제공합니다.

이 릴리스에서는 데이터 객체(data object)라는 새로운 유형의 객체 선언을 소개합니다. 데이터 객체는 개념적으로 일반 객체 선언과 동일하게 작동하지만 toString 표현을 제공합니다.

 

 

package org.example
object MyObject
data object MyDataObject

fun main() {
    println(MyObject) // org.example.MyObject@1f32e575
    println(MyDataObject) // MyDataObject
}

 

이로써 데이터 객체 선언은 실링된 클래스 계층 구조에서 이들을 데이터 클래스 선언과 함께 사용할 수 있는 이상적인 선택이 됩니다. 이 스니펫에서 일반 객체 대신 데이터 객체로 EndOfFile를 선언하는 것은 수동으로 override하지 않고도 예쁜 toString을 얻을 수 있으므로 데이터 클래스 정의와 대칭성을 유지할 수 있습니다:

sealed class ReadResult {
    data class Number(val value: Int) : ReadResult()
    data class Text(val value: String) : ReadResult()
    data object EndOfFile : ReadResult()
}

fun main() {
    println(ReadResult.Number(1)) // Number(value=1)
    println(ReadResult.Text("Foo")) // Text(value=Foo)
    println(ReadResult.EndOfFile) // EndOfFile
}


데이터 객체를 활성화하는 방법


데이터 객체 선언을 코드에서 사용하려면 -language-version 1.9 컴파일러 옵션을 활성화하십시오. Gradle 프로젝트에서는 다음을 build.gradle(.kts)에 추가하여 수행할 수 있습니다:

tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>().configureEach {
    // ...
    kotlinOptions.languageVersion = "1.9"
}


데이터 객체에 대한 자세한 내용은 관련 KEEP 문서에서 확인하고 의견을 공유하십시오.


새로운 빌더 유형 추론 제한 사항

 

Kotlin 1.7.20에서는 빌더 유형 추론의 사용에 대한 중요한 제한 사항이 도입되었습니다. 이러한 제한 사항은 빌더 람다 함수를 포함하는 코드에 적용되며, 람다 자체를 분석하지 않고는 매개변수를 유추할 수 없는 경우에 해당합니다. 이 매개변수는 함수의 인자로 사용됩니다. 이제 컴파일러는 이러한 코드에 대해 항상 오류를 표시하고 유형을 명시적으로 지정하도록 요청합니다.

이것은 파괴적인 변경 사항이지만 연구 결과, 이러한 경우가 매우 드물고 대부분의 코드에는 영향을 미치지 않을 것으로 나타납니다. 그러나 영향을 받는 경우 다음과 같은 상황을 고려해 보십시오:

- 멤버를 가려버리는 확장 함수와 함께 빌더 추론

만약 코드에 빌더 추론 중에 사용될 동일한 이름의 확장 함수가 있는 경우 컴파일러는 오류를 표시합니다:

class Data {
    fun doSmth() {} // 1
}

fun <T> T.doSmth() {} // 2

fun test() {
    buildList {
        this.add(Data())
        this.get(0).doSmth() // 2로 해석되어 오류 발생
    }
}


이 코드를 수정하려면 유형을 명시적으로 지정해야 합니다:

class Data {
    fun doSmth() {} // 1
}

fun <T> T.doSmth() {} // 2

fun test() {
    buildList<Data> { // 유형 인자를 명시!
        this.add(Data())
        this.get(0).doSmth() // 1로 해석
    }
}


- 명시적으로 유형 인자를 지정하지 않은 상태에서 여러 람다가 있는 빌더 추론

만약 빌더 추론 중에 두 개 이상의 람다 블록이 있는 경우 이것들은 유형에 영향을 미칩니다. 오류를 방지하려면 컴파일러가 유형을 지정하도록 요구합니다:

fun <T: Any> buildList(
    first: MutableList<T>.() -> Unit,
    second: MutableList<T>.() -> Unit
): List<T> {
    val list = mutableListOf<T>()
    list.first()
    list.second()
    return list
}

fun main() {
    buildList(
        first = { // this: MutableList<String>
            add("")
        },
        second = { // this: MutableList<Int>
            val i: Int = get(0)
            println(i)
        }
    )
}


오류를 수정하려면 유형을 명시적으로 지정하고 유형 불일치를 수정해야 합니다:

fun main() {
    buildList<Int>(
        first = { // this: MutableList<Int>
            add(0)
        },
        second = { // this: MutableList<Int>
            val i: Int = get(0)
            println(i)
        }
    )
}


만약 여기서 언급되지 않은 상황이라면, 저희 팀에 문제를 제기하십시오.

빌더 추론 업데이트에 대한 자세한 정보는 이 YouTrack 이슈를 참조하십시오.

 

Kotlin/JVM

 

Kotlin 1.7.20에서는 제네릭 인라인 클래스를 도입하고, 위임된 프로퍼티에 대한 더 많은 바이트코드 최적화를 추가하며, kapt 스텁 생성 작업에서 JVM IR을 지원합니다. 이로써 kapt를 사용하여 모든 최신 Kotlin 기능을 사용할 수 있게 됩니다.


제네릭 인라인 클래스


제네릭 인라인 클래스는 실험적인 기능입니다. 언제든지 폐기되거나 변경될 수 있습니다. 이를 활성화하려면 Opt-in(활성화)이 필요하며, 평가 목적으로만 사용해야 합니다. 이에 대한 의견을 YouTrack에서 환영합니다.

Kotlin 1.7.20에서는 JVM 인라인 클래스의 기본 타입을 타입 매개변수로 사용할 수 있게 했습니다. 컴파일러는 이를 Any? 또는 일반적으로 타입 매개변수의 상한으로 매핑합니다.

 


다음 예제를 고려해보세요:

@JvmInline
value class UserId<T>(val value: T)

fun compute(s: UserId<String>) {} // 컴파일러는 fun compute-<해시코드>(s: Any?)를 생성합니다


이 함수는 인라인 클래스를 매개변수로 받습니다. 매개변수는 타입 아규먼트가 아닌 상한으로 매핑됩니다.

이 기능을 활성화하려면 -language-version 1.8 컴파일러 옵션을 사용하세요.

이 기능에 대한 의견을 YouTrack에서 환영합니다.


더 많은 최적화된 위임 프로퍼티


Kotlin 1.6.0에서는 프로퍼티를 위임하는 경우 $delegate 필드를 생략하고 참조된 프로퍼티에 대한 직접 액세스를 생성하여 최적화하는 경우를 최적화했습니다. 1.7.20에서는 이 최적화를 더 많은 경우에 적용했습니다. 이제 $delegate 필드는 다음 경우에 생략됩니다:

- 이름이 있는 객체:

object NamedObject {
    operator fun getValue(thisRef: Any?, property: KProperty<*>): String = ...
}

val s: String by NamedObject


- 모듈 내에서 백킹 필드와 기본 게터가 있는 final val 프로퍼티:

val impl: ReadOnlyProperty<Any?, String> = ...

class A {
    val s: String by impl
}


- 상수 표현식, 열거형 항목, this 또는 null:

class A {
    operator fun getValue(thisRef: Any?, property: KProperty<*>) ...

    val s by this
}


더 많은 내용은 위임 프로퍼티에 대해 알아보세요.

이 기능에 대한 의견을 YouTrack에서 환영합니다.


kapt 스텁 생성 작업에서 JVM IR 백엔드 지원


kapt 스텁 생성 작업에서 JVM IR 백엔드를 지원하는 것은 실험적인 기능입니다. 언제든지 변경될 수 있습니다. 이를 활성화하려면 Opt-in(활성화)이 필요하며, 평가 목적으로만 사용해야 합니다.

1.7.20 이전에는 kapt 스텁 생성 작업에서 이전 백엔드를 사용하고, 반복 가능한 어노테이션은 kapt와 함께 작동하지 않았습니다. Kotlin 1.7.20에서는 kapt 스텁 생성 작업에서 JVM IR 백엔드를 지원하도록 추가되었습니다. 이로써 kapt를 사용하여 반복 가능한 어노테이션을 포함한 모든 최신 Kotlin 기능을 사용할 수 있게 되었습니다.

kapt에서 IR 백엔드를 사용하려면 gradle.properties 파일에 다음 옵션을 추가하십시오:

kapt.use.jvm.ir=true


이 기능에 대한 의견을 YouTrack에서 환영합니다.

 

Kotlin/Native

 

Kotlin 1.7.20에서는 새로운 Kotlin/Native 메모리 매니저가 기본적으로 활성화되며 Info.plist 파일을 사용자 정의하는 옵션을 제공합니다.


기본적으로 활성화된 새로운 Kotlin/Native 메모리 매니저


이 릴리스에서는 새로운 메모리 매니저에 대한 안정성 및 성능 개선이 이루어졌으며, 이를 Beta로 승격할 수 있게 되었습니다.

이전 메모리 매니저는 kotlinx.coroutines 라이브러리를 구현하는 등 동시 및 비동기 코드 작성을 복잡하게 만들었습니다. 이로 인해 Kotlin 코드를 iOS와 Android 플랫폼 간에 공유하는 데 문제가 생기며, Kotlin Multiplatform Mobile의 채택을 어렵게 했습니다. 새로운 메모리 매니저는 Kotlin Multiplatform Mobile을 Beta로 승격하는 길을 열어줍니다.

또한 새로운 메모리 매니저는 컴파일러 캐시를 지원하며, 이로 인해 이전 릴리스와 동등한 컴파일 시간을 제공합니다. 새 메모리 매니저의 이점에 대한 자세한 내용은 미리 보기 버전에 대한 원래 블로그 게시물을 참조하십시오. 기술적인 세부 사항은 문서에서 확인할 수 있습니다.


구성 및 설정


Kotlin 1.7.20부터 새 메모리 매니저가 기본값입니다. 추가 설정이 필요하지 않습니다.

이미 수동으로 활성화했다면 gradle.properties 파일에서 kotlin.native.binary.memoryModel=experimental 옵션을 제거하거나 build.gradle(.kts) 파일에서 binaryOptions["memoryModel"] = "experimental"을 제거할 수 있습니다.

필요한 경우 gradle.properties에서 kotlin.native.binary.memoryModel=strict 옵션을 사용하여 이전 메모리 매니저로 전환할 수 있습니다. 그러나 이전 메모리 매니저에는 더 이상 컴파일러 캐시 지원이 제공되지 않으므로 컴파일 시간이 악화될 수 있습니다.


동결


새 메모리 매니저에서는 동결이 더 이상 권장되지 않습니다. 이를 사용하지 마십시오. 이전 메모리 매니저(여전히 동결이 필요한 경우)와 작동하도록 코드를 필요로 하는 라이브러리 작성자나 새 메모리 매니저에 문제가 발생할 경우 대비할 필요가 있는 개발자를 위한 것입니다.

이러한 경우, 새로운 및 이전 메모리 매니저를 모두 지원하는 코드를 일시적으로 지원할 수 있습니다. 폐기 경고를 무시하려면 다음 중 하나를 수행하십시오:

  • 폐기된 API의 사용에 @OptIn(FreezingIsDeprecated::class)를 적용하세요.
  • Gradle에서 모든 Kotlin 소스 세트에 languageSettings.optIn("kotlin.native.FreezingIsDeprecated")을 적용하세요.
  • 컴파일러 플래그 -opt-in=kotlin.native.FreezingIsDeprecated를 전달하세요.


Swift/Objective-C에서 Kotlin 중단 함수 호출하기


새 메모리 매니저는 여전히 메인 스레드 이외의 스레드에서 Swift와 Objective-C에서 Kotlin 중단 함수를 호출하는 것을 제한하지만 새로운 Gradle 옵션을 사용하여 이 제한을 해제할 수 있습니다.

이 제한은 원래 이전 메모리 매니저에서 도입되었으며 코드가 원래 스레드에서 계속 진행될 continuation을 디스패치하는 경우에 도입되었습니다. 이 스레드에 지원되는 이벤트 루프가 없으면 작업이 실행되지 않으며 coroutine은 재개되지 않습니다.

특정 경우에는 이 제한이 더 이상 필요하지 않지만 필요한 모든 조건을 확인하는 것은 쉽지 않습니다. 따라서 이 제한은 새 메모리 매니저에 유지되면서 해제 옵션을 도입하기로 결정되었습니다. 이를 위해 gradle.properties에 다음 옵션을 추가하세요.

 

kotlin.native.binary.objcExportSuspendFunctionLaunchThreadRestriction=none


native-mt 버전의 kotlinx.coroutines 또는 동일한 "원래 스레드로 디스패치" 접근 방식을 사용하는 다른 라이브러리를 사용하는 경우 이 옵션을 추가하지 마세요.

Kotlin 팀은 이 옵션을 구현한 Ahmed El-Helw에게 감사드립니다.

피드백 남기기


이것은 Kotlin 생태계에 대한 중요한 변경 사항입니다. 더 나은 기능을 만들기 위해 여러분의 피드백을 환영합니다.

새 메모리 매니저를 여러분의 프로젝트에서 사용해 보고 issue tracker인 YouTrack에서 의견을 공유해 주세요.

 

Info.plist 파일 사용자 정의


프레임워크를 생성할 때 Kotlin/Native 컴파일러는 정보 속성 목록 파일인 Info.plist를 생성합니다. 이전에는 이 내용을 사용자 정의하는 것이 까다로웠지만 Kotlin 1.7.20에서는 다음 속성을 직접 설정할 수 있습니다.

 


이를 위해 해당하는 바이너리 옵션을 사용하십시오. 필요한 프레임워크에 대한 -Xbinary=$option=$value 컴파일러 플래그를 전달하거나 필요한 프레임워크에 대한 binaryOption(option, value) Gradle DSL을 설정하세요.

Kotlin 팀은 이 기능을 구현한 Mads Ager에게 감사드립니다.

 

Kotlin/JS

 

Kotlin/JS에서는 개발자 경험을 향상시키고 성능을 향상시키는 몇 가지 개선 사항이 있습니다:

  • Klib 생성 속도 향상: 종속성 로딩의 효율성 개선으로 인해 Klib 생성이 증분 및 클린 빌드 모두에서 더 빨라졌습니다.
  • 증분 컴파일 개선: 개발용 이진 파일의 증분 컴파일이 개편되어 클린 빌드 시나리오에서 큰 개선, 더 빠른 증분 빌드 및 안정성 문제 해결이 이루어졌습니다.
  • .d.ts 생성 개선: 중첩된 객체, sealed 클래스 및 생성자의 선택적 매개변수에 대한 .d.ts(타입 선언 파일) 생성이 개선되었습니다.

 

Gradle

 

Kotlin Gradle 플러그인에 대한 업데이트는 새로운 Gradle 기능과 최신 Gradle 버전과의 호환성에 중점을 두고 있습니다.

Kotlin 1.7.20에는 Gradle 7.1을 지원하기 위한 변경 사항이 포함되어 있습니다. Kotlin Gradle 플러그인에서 사용되는 폐기된 메서드 및 속성이 제거되거나 대체되어 Kotlin Gradle 플러그인에서 생성되는 폐기 경고의 수가 줄어들게 되었으며, Gradle 8.0에 대한 미래 지원이 가능해졌습니다.

그러나 이에 주의해야 할 잠재적으로 파괴적인 변경 사항이 몇 가지 있습니다:


대상 구성

 

  • org.jetbrains.kotlin.gradle.dsl.SingleTargetExtension은 이제 제네릭 매개변수인 SingleTargetExtension<T : KotlinTarget>를 가집니다.
  • kotlin.targets.fromPreset() 규칙이 폐기되었습니다. 대신 kotlin.targets { fromPreset() }을 여전히 사용할 수 있지만 더 특화된 방법으로 대상을 생성하는 것을 권장합니다.
  • Gradle에 의해 자동 생성되는 대상 접근자는 kotlin.targets { } 블록 내에서 더 이상 사용할 수 없습니다. 대신 findByName("targetName") 메서드를 사용하세요.

    kotlin.targets의 경우에는 여전히 이러한 접근자를 사용할 수 있습니다. 예를 들어 kotlin.targets.linuxX64입니다.


소스 디렉토리 구성

 

Kotlin Gradle 플러그인은 이제 Kotlin SourceDirectorySet을 Java의 SourceSet 그룹의 kotlin 확장으로 추가합니다. 이렇게하면 build.gradle.kts 파일에서 Kotlin 소스 디렉토리를 Java, Groovy 및 Scala와 유사하게 구성할 수 있습니다.

 

sourceSets {
    main {
        kotlin {
            java.setSrcDirs(listOf("src/java"))
            kotlin.setSrcDirs(listOf("src/kotlin"))
        }
    }
}

 

이제 Kotlin을 위한 소스 디렉토리를 설정할 때 이전에 사용되던 폐기된 Gradle 규칙을 사용할 필요가 없습니다.

 

KotlinSourceSet에 액세스하기 위해 kotlin 확장을 사용할 수도 있습니다.

 

kotlin {
    sourceSets {
        main {
        // ...
        }
    }
}


JVM 도구 체인 구성을 위한 새로운 메서드

 

이 릴리스에서는 JVM 도구 체인 기능을 활성화하기 위한 새로운 jvmToolchain() 메서드를 제공합니다. 추가 구성 필드(예: implementation 또는 vendor)가 필요하지 않은 경우 Kotlin 확장에서 이 메서드를 사용할 수 있습니다. 이것은 추가 구성없이 Kotlin 프로젝트 설정 프로세스를 간소화합니다. 이전 릴리스에서는 JDK 버전을 다음과 같이 지정할 수 있었습니다:

 

kotlin {
    jvmToolchain(17)
}


새로운 jvmToolchain() 메서드를 사용하면 더 간단하게 JDK 버전을 설정할 수 있습니다:

 

kotlin {
    jvmToolchain {
        languageVersion.set(JavaLanguageVersion.of(17))
    }
}

 

표준 라이브러리

 

Kotlin 1.7.20은 `java.nio.file.Path` 클래스에 대한 새로운 확장 함수를 제공합니다. 이를 통해 파일 트리를 탐색할 수 있습니다:

 

  • walk() 함수: 이 함수는 지정된 경로에서 시작하는 파일 트리를 지연 처리 방식으로 탐색합니다.
  • fileVisitor() 함수: 이 함수를 사용하면 별도의 FileVisitor를 생성할 수 있습니다. FileVisitor는 디렉터리와 파일을 탐색할 때 수행할 작업을 정의합니다.
  • visitFileTree(fileVisitor, ...) 함수: 이 함수는 준비된 FileVisitor를 사용하며 내부적으로 `java.nio.file.Files.walkFileTree()`를 사용합니다.
  • visitFileTree(..., builderAction: FileVisitorBuilder.() -> Unit) 함수: 이 함수는 builderAction과 함께 FileVisitor를 생성하고 `visitFileTree(fileVisitor, ...)` 함수를 호출합니다.
  • FileVisitor의 반환 타입인 `FileVisitResult`에는 파일 처리를 계속하는 CONTINUE 기본값이 있습니다.


`java.nio.file.Path`에 대한 이러한 새로운 확장 함수는 실험적인 것으로 표시되어 있으며 언제든지 변경될 수 있습니다. Opt-in이 필요하며, 평가 목적으로만 사용해야 합니다.

이러한 새로운 확장 함수를 사용하여 다음과 같은 작업을 수행할 수 있습니다:

- 명시적으로 FileVisitor를 생성한 다음 사용:

val cleanVisitor = fileVisitor {
    onPreVisitDirectory { directory, attributes ->
        // 디렉터리 방문 시 로직 수행
        FileVisitResult.CONTINUE
    }

    onVisitFile { file, attributes ->
        // 파일 방문 시 로직 수행
        FileVisitResult.CONTINUE
    }
}

// 여기에 추가 로직을 추가할 수 있음

projectDirectory.visitFileTree(cleanVisitor)


- builderAction을 사용하여 FileVisitor를 생성하고 즉시 사용:

projectDirectory.visitFileTree {
    onPreVisitDirectory { directory, attributes ->
        // 디렉터리 방문 시 로직 수행
        FileVisitResult.CONTINUE
    }

    onVisitFile { file, attributes ->
        // 파일 방문 시 로직 수행
        FileVisitResult.CONTINUE
    }
}


- walk() 함수를 사용하여 지정된 경로에서 시작하는 파일 트리를 탐색:

@OptIn(kotlin.io.path.ExperimentalPathApi::class)
fun traverseFileTree() {
    val cleanVisitor = fileVisitor {
        onPreVisitDirectory { directory, _ ->
            if (directory.name == "build") {
                directory.toFile().deleteRecursively()
                FileVisitResult.SKIP_SUBTREE
            } else {
                FileVisitResult.CONTINUE
            }
        }

        onVisitFile { file, _ ->
            if (file.extension == "class") {
                file.deleteExisting()
            }
            FileVisitResult.CONTINUE
        }
    }

    // 파일 트리의 루트 디렉터리 생성 등의 작업 수행

    // walk() 함수 사용:
    val directoryStructure = rootDirectory.walk(PathWalkOption.INCLUDE_DIRECTORIES)
        .map { it.relativeTo(rootDirectory).toString() }
        .toList().sorted()
    assertPrints(directoryStructure, "[, build, build/Project.jar, src, src/A.class, src/A.kt]")

    rootDirectory.visitFileTree(cleanVisitor)

    val directoryStructureAfterClean = rootDirectory.walk(PathWalkOption.INCLUDE_DIRECTORIES)
        .map { it.relativeTo(rootDirectory).toString() }
        .toList().sorted()
    assertPrints(directoryStructureAfterClean, "[, src, src/A.kt]")
}


이러한 실험적인 API를 사용하려면 `@OptIn(kotlin.io.path.ExperimentalPathApi::class)` 주석을 추가하거나 `-opt-in=kotlin.io.path.ExperimentalPathApi`와 같은 컴파일러 옵션을 사용할 수 있습니다.

 

 walk() 함수와 visit 확장 함수에 대한 피드백은 YouTrack에서 환영합니다.

 

문서 업데이트

 

이전 릴리스 이후 Kotlin 문서에 주목할만한 변경 사항이 있었습니다:

개선 및 개정된 페이지

 

  • 기본 유형 개요 - Kotlin에서 사용되는 기본 유형인 숫자, 부울, 문자, 문자열, 배열 및 부호 없는 정수 숫자에 대해 알아보세요.
  • Kotlin 개발용 IDE - 공식 Kotlin 지원을 받는 IDE 및 커뮤니티 지원 플러그인을 가진 도구 목록을 확인하세요.

 

저널의 새로운 기사

 

  • 네이티브 및 크로스 플랫폼 앱 개발: 어떻게 선택해야 할까? - 크로스 플랫폼 앱 개발과 네이티브 접근법의 개요 및 장점을 살펴보세요.
  • 최고의 크로스 플랫폼 앱 개발 프레임워크 6가지 - 크로스 플랫폼 프로젝트에 적합한 프레임워크를 선택하는 데 도움이 되는 주요 측면에 대해 읽어보세요.


새로운 및 업데이트된 자습서

 

  • Kotlin Multiplatform Mobile 시작하기 -  Kotlin을 사용하여 Android 및 iOS에서 모두 작동하는 앱을 만들며 Kotlin Multiplatform Mobile에 대해 배웁니다.
  • Kotlin Multiplatform을 사용하여 전체 스택 웹 앱 만들기 - Kotlin을 사용하여 Kotlin/JVM 서버 부분과 Kotlin/JS 웹 클라이언트를 사용하여 앱을 만드는 방법을 배웁니다.
  • React 및 Kotlin/JS를 사용하여 웹 애플리케이션 만들기 - Kotlin의 DSL 및 일반적인 React 프로그램의 기능을 탐구하면서 브라우저 앱을 만드는 방법을 배웁니다.

 

릴리스 문서의 변경 사항


각 릴리스별로 권장되는 kotlinx 라이브러리 목록을 더 이상 제공하지 않습니다. 이 목록은 Kotlin과 테스트된 버전만을 권장했으며 서로 의존하고 특정 kotlinx 버전이 필요한 경우도 고려하지 않았습니다. 이로 인해 프로젝트에서 Kotlin 버전을 업그레이드할 때 어떤 kotlinx 라이브러리 버전을 사용해야 하는지 명확하지 않았습니다.

우리는 라이브러리가 서로 어떻게 관련되고 의존하는지에 대한 정보를 제공하는 방법을 찾고 있으며, 이를 통해 프로젝트에서 Kotlin 버전을 업그레이드할 때 어떤 kotlinx 라이브러리 버전을 사용해야 하는지 명확해질 것입니다.

 

Kotlin 1.7.20 설치하기


IntelliJ IDEA 2021.3, 2022.1 및 2022.2는 Kotlin 플러그인을 1.7.20으로 업데이트하도록 자동으로 제안합니다.

Android Studio Dolphin (213), Electric Eel (221) 및 Flamingo (222)의 경우, Kotlin 플러그인 1.7.20은 곧 출시될 Android Studio 업데이트와 함께 제공될 것입니다.

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

Kotlin 1.7.20 호환성 가이드


Kotlin 1.7.20은 점진적 릴리스이지만 Kotlin 1.7.0에서 도입된 문제의 확산을 제한하기 위해 호환되지 않는 변경 사항을 아직도 수행해야 했습니다.

Kotlin 1.7.20의 호환성 가이드에서 이러한 변경 사항의 자세한 목록을 찾을 수 있습니다.

 

원문

 

https://kotlinlang.org/docs/whatsnew1720.html#install-kotlin-1-7-20

 

 

반응형

댓글