본문 바로가기
Kotlin/Release Notes

[Kotlin Release Notes] Kotlin 1.3.40 released

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

2019년 6월 19일

 

기쁜 소식입니다. 오늘은 Kotlin 1.3.40의 새로운 릴리스를 소개합니다. 이 버전에서의 주요 포커스는 품질과 툴링 개선뿐만 아니라 다음과 같습니다.

  • Kotlin/JS를 위한 NPM, Yarn 및 Webpack에 대한 Gradle 지원
  • 멀티플랫폼 프로젝트용 테스트 러너 개선
  • 새로운 타입 추론
  • Kotlin/Native의 성능 및 상호 운용성 개선

 

표준 라이브러리에 실험적 상태의 새 함수를 추가했습니다.

 

변경 사항의 완전한 목록은 변경 로그에서 확인할 수 있습니다. 항상 외부 기여자분들께 감사드립니다.

자세한 내용을 살펴보겠습니다.


표준 라이브러리의 실험적 함수


표준 라이브러리에 실험적 상태의 새로운 함수들이 추가되었습니다. 이중에는 바이트/문자 배열을 UTF-8 인코딩으로 문자열로 인코딩/디코딩하는 일반 함수도 포함되어 있습니다.

  • ByteArray.decodeToString 및 String.encodeToByteArray
  • CharArray.concatToString 및 String.toCharArray


또한 JVM에서 capitalize라는 실험적 함수도 추가되었으며 이 함수는 Locale 객체를 매개변수로 사용합니다.

이러한 함수를 사용하려면 명시적으로 opt-in 해야 합니다. 즉, 사용하는 곳 @UseExperimental(ExperimentalStdlibApi::class) 주석을 추가하거나 컴파일러 인수로 -Xuse-experimental=kotlin.ExperimentalStdlibApi를 제공해야 합니다.

 

 

이번 릴리스에서 ExperimentalStdlibApi 주석이 도입되어 표준 라이브러리에서 실험적인 API를 나타냅니다. 이러한 API의 동작은 피드백에 따라 변경될 수 있으므로 호환성 보장이 없습니다. 실험 주석에 대한 자세한 내용은 문서에서 확인할 수 있습니다.


JVM에서 리플렉션을 사용하여 리파이드 유형에 액세스하기 {#type-of}


이번 릴리스에서 추가된 다른 실험적인 함수는 typeOf 함수입니다. 간단히 말해, 이 함수를 사용하여 주어진 유형에 대한 KType의 인스턴스를 생성할 수 있습니다.

val intType: KType = typeOf<int>()
println(String::length.returnType == intType) // true

 

하지만 실제 이점은 reified 제네릭 유형 인수에 대한 정보를 검색할 때 나타납니다. T가 리파이드 제네릭 유형 인수인 상태에서 typeOf()를 호출하면 유형 인수의 실제 값이 반환됩니다.

 

@UseExperimental(ExperimentalStdlibApi::class)
inline fun <reified T> accessReifiedTypeArg() {
    val kType = typeOf<T>()
    println(kType.toString())
}

fun main() {
    accessReifiedTypeArg<String>() // kotlin.String
    accessReifiedTypeArg<List<String>>() // kotlin.collections.List<kotlin.String>
}

 

현재 typeOf는 Kotlin/JVM에서만 사용할 수 있지만, 향후 버전에서는 다른 플랫폼인 Kotlin/JS와 Kotlin/Native에 유사한 기능이 추가될 것입니다.

 

trimIndent 및 trimMargin에 대한 최적화


더 나은 코드 포맷팅을 위해 여러 줄 문자열은 일반적으로 trimIndent 또는 trimMargin과 함께 사용됩니다. 이번 릴리스부터 컴파일러에서 trimIndent 및 trimMargin 호출이 최적화됩니다. 해당 라이브러리 함수를 호출하는 대신, 컴파일러가 직접 작업을 수행하고 바이트 코드에서 잘린 문자열 리터럴을 생성합니다.

 

fun main() {
    println(
        """
        |first
        |second
        """.trimMargin()
    )

    // 바이트 코드에서는 다음과 같이 대체됩니다:
    // println("first\nsecond")
}

 

이 최적화는 수신 함수와 여백 접두사가 상수 표현식이고 (예: "$x"와 같은 보간된 변수가 없는) 경우에만 작동합니다.

minBy 및 maxBy 함수는 호출된 컬렉션이 하나의 요소만 포함하면 지정된 선택기 함수를 더 이상 호출하지 않습니다. 선택기 함수에서 발생한 부작용에 의존하는 경우 주의하십시오.

 

IntelliJ IDEA에서 외부 어노테이션 사용하기


Java에서 외부 널 어노테이션을 사용하는 경우 IDE는 이제 Kotlin에서 어노테이션된 Java 메서드의 잘못된 사용에 대한 경고를 표시할 수 있습니다.

Java 메서드가 외부 어노테이션으로 어노테이션 처리된 경우를 상상해보십시오. IntelliJ IDEA는 이러한 어노테이션을 표시할 수 있지만 코드에는 존재하지 않습니다.


이 어노테이션은 별도의 annotations.xml 파일에 선언됩니다.

<root>
    <item name="JavaClass java.lang.String nullableString()">
        <annotation name="org.jetbrains.annotations.Nullable"/>
    </item>
</root>

 

이 릴리스부터는 Kotlin에서 이 Java 메서드를 잘못 사용한 경우 경고가 표시됩니다.

 

 

이것은 순전히 IDE 기능입니다. Kotlin 컴파일러는 여전히 nullableString의 유형을 플랫폼 유형 String!으로 추론하지만 IDE는 추가 경고를 표시합니다.

 

새로운 유형 추론 알고리즘 작업 중 {#new-type-inference}


저희는 유형 추론을 위한 개선된 알고리즘을 개발 중입니다. 이 알고리즘은 다양한 코너 케이스 문제를 해결하고 새로운 시나리오를 지원합니다. 수정된 이슈 목록은 상당히 인상적입니다. 향후 Kotlin 버전에서는 현재 사용 중인 알고리즘을 대체하고 기본으로 사용할 것입니다.

새로운 알고리즘으로 전환할 때 역 호환성은 우리에게 매우 중요합니다. 따라서 실제 예제에서 피드백을 수집하기 위해 이 릴리스에서는 IDE에서만 기본으로 사용하도록 전환했습니다. IDE에서 코드가 올바르게 작동하지만 복잡한 코너 케이스에 대한 유형 추론과 관련된 다른 버그로 인해 컴파일러에서 지원되지 않을 수 있습니다. 코드가 IDE에서 빨간색으로 표시되지만 Kotlin 컴파일러로는 정상적으로 컴파일되거나 그 반대의 경우 불일치하는 동작을 관찰하면 새로운 이슈를 제출하여 알려주십시오. 이 모드가 프로젝트에 잘 작동하지 않는 경우 기본 설정에서 IDE 분석을 위한 새로운 유형 추론 알고리즘 활성화 확인란을 선택 해제하여 비활성화할 수 있습니다(안드로이드 스튜디오에서는 기본 설정이 다른 위치에 있습니다: 환경 설정 | Kotlin 컴파일러).

여러분의 피드백을 기다리고 있겠습니다!


멀티플랫폼 프로젝트 (MPP)


Kotlin/Native 및 Kotlin/JS용 테스트 러너는 이제 Gradle 테스트 러너 API를 모두 구현하며 Kotlin/JVM 테스트 러너와 유사한 방식으로 작동합니다. 소스 코드 탐색을 통한 테스트 실패 보고서가 콘솔에 출력됩니다. 또한 Gradle에 의해 테스트 보고서가 생성됩니다. 표준 Gradle 매개변수를 통해 테스트 필터링 매개변수도 지원됩니다. 예: --tests some.test.ClassName.

Gradle에서 Kotlin/Native, Kotlin/JS 및 Kotlin/JVM을 포함한 모든 대상에서 모든 테스트 실행에 대한 정보를 포함하는 결합 테스트 실행 보고서를 생성할 수 있습니다.

 


Kotlin/JS


Kotlin/JS의 점진적 컴파일 성능이 개선되었습니다. 특히 많은 종속성을 가진 대형 프로젝트 또는 모듈의 컴파일 시간이 일부 경우에 최대 30% 감소했습니다.

이 릴리스에서 Kotlin/JS의 가장 눈에 띄는 변경 사항 중 하나는 도구 측면에서 이루어졌습니다. 우리는 업데이트된 Kotlin/JS Gradle 플러그인을 소개하게 되어 기쁩니다. 이제 org.jetbrains.kotlin.js로 이름이 변경되었으며 Gradle 플러그인 포털에서 사용할 수 있습니다. build.gradle에서 다음과 같이 plugins {} 구문을 사용하여 활성화할 수 있습니다:

 

plugins {
    id("org.jetbrains.kotlin.js") version "1.3.40"
}

 

또는 build.gradle.kts에서 kotlin 함수를 사용할 수 있습니다:

 

plugins {
    kotlin("js") version "1.3.40"
}

 

우리는 kotlin-frontend-plugin 플러그인의 모든 기능을 Kotlin/JS 플러그인 및 Kotlin/Multiplatform 플러그인으로 이전하는 데 열심히 노력하고 있습니다. 일부 기능은 이미 실험적으로 포함되어 있습니다. 이 작업이 완료되면 kotlin-frontend-plugin을 폐기할 계획입니다.


실험적으로 NPM 및 Webpack 지원


오늘, 우리는 Node.js, NPM, Yarn 또는 Webpack을 사용하는 JavaScript 프로젝트의 개발을 단순화하기 위한 몇 가지 실험적인 기능을 더 공유해 드릴 것을 기쁘게 생각합니다. Kotlin/JS와 Multiplatform Gradle 플러그인에 통합을 간단화하기 위한 도우미 작업을 추가했습니다. 이 플러그인은 프로젝트를 위해 임시 package.json을 생성하고 NPM 종속성 및 node_modules를 자동으로 관리하기 위해 Yarn을 다운로드하고 사용할 것입니다. 코드에서 모든 종속성을 결합하고 브라우저 친화적인 스크립트를 생성하기 위해 내부에서 Webpack이 사용됩니다.

플러그인은 Gradle 프로젝트에서 선언된 모든 Kotlin/JS 종속성을 자동으로 유지되는 node_modules 폴더에 첨부합니다. 새로운 npm 함수가 JS SourceSet의 dependencies {} 블록에서 Gradle 스크립트에서 NPM 종속성을 추가하는 것이 지원됩니다:

 

dependencies {
    implementation(npm("react", "16.8.3"))
}

 

멀티 프로젝트 Gradle 빌드에서 Yarn Workspaces를 사용합니다. 서브 프로젝트 당 작업 공간이 생성되고 루트 프로젝트의 빌드 디렉토리 아래로 구성됩니다. 이를 통해 Yarn은 공통 종속성을 루트 node_modules로 추출하여 서브 프로젝트에서 node_modules 사본을 줄일 수 있습니다.


Node.js 및 브라우저 모드


JavaScript 프로젝트를 실행하거나 테스트하는 데 항상 환경이 의존했습니다. 이제 Node.js 및 브라우저 실행 환경을 지원하기 위한 기능을 추가했습니다. Kotlin/JS 및 Multiplatform Gradle 플러그인 모두 Kotlin 대상을 구성하기 위해 nodejs {} 또는 browser {} 함수를 사용할 수 있습니다.

 

kotlin {
    // 다중 플랫폼 프로젝트에는 js()를 사용하십시오
    target {
        nodejs()
        browser()
    }
    
    sourceSets["main"].dependencies {
        implementation(kotlin("stdlib-js"))
        implementation(npm("react", "16.8.3"))
    }
}

 

Gradle 플러그인은 코드의 테스트를 실행하기 위해 필요한 모든 NPM 종속성을 다운로드하고 설치할 것입니다(물론 Yarn을 사용합니다). 카르마 테스트를 위한 무머 테스트 프레임워크는 Node.js 환경에서 테스트를 실행하는 데 사용됩니다. 테스트 실행기는 Gradle과 통합되어 Kotlin/JVM 테스트에서 사용 가능한 기능과 유사한 기능을 구현합니다. 예를 들어, 테스트 실패는 콘솔에 표시되며 테스트 보고서가 생성되며 Gradle 명령 줄로 테스트 필터를 전달할 수 있습니다.

때로는 오류를 개선하기 위해 코드의 어느 지점으로 돌아가야 하는 것이 어려울 수 있으므로 Gradle 플러그인의 모든 이러한 작업에 JavaScript 소스 맵 지원을 추가했습니다.

 

 

다른 브라우저에서 브라우저 테스트를 쉽게 실행하도록 구성할 수 있습니다. 플러그인은 이를 가능하게 하기 위해 Karma 테스트 러너에 대한 NPM 종속성을 구성할 것입니다. Gradle에서 다음과 같은 DSL을 사용하여 이 작업을 수행할 수 있습니다:

 

kotlin {
    // 다중 플랫폼 프로젝트에는 js()를 사용하십시오
    target {
        browser {
            testTask {
                useKarma {
                    useIe()
                    useSafari()
                    useFirefox()
                    useChrome()
                    useChromeCanary()
                    useChromeHeadless()
                    usePhantomJS()
                    useOpera()
                }
            }
        }
    }
}

 

또한 Gradle 플러그인에 Kotlin/JS 코드를 Node.js 또는 브라우저 환경에서 실행하기 위한 실행 작업도 추가되었습니다.

참고로, 새로운 Kotlin/JS 빌드 기능은 실험적이며 현재 macOS와 Linux에서만 지원됩니다. Windows 지원은 나중에 추가될 예정입니다.

 

Kotlin/Native


Kotlin/Native 애플리케이션의 성능을 향상시키기 위해 메모리 매니저에 여러 개선 사항이 추가되었습니다. 벤치마크에서 거의 두 배에 해당하는 성능 향상이 확인되었습니다.

Linux 대상용으로 ARM x64 (ARM/AArch64) 지원이 추가되었습니다. macOS에서는 CoreLocation 프레임워크가 사전으로 가져와집니다. Kotlin/Native 컴파일러에서 표시되는 로깅 및 오류 메시지도 개선되었습니다.

Kotlin/Native에서 멀티 스레드와 동시성을 처리하는 데 도움이 되는 새로운 실험적 클래스인 FreezableAtomicReference가 추가되었습니다. 이 클래스는 얼려져 있든 아니든 상관없이 AtomicReference 클래스처럼 동작합니다.

kotlin-platform-native는 이제 더 이상 사용되지 않으며 kotlin-multiplatform Gradle 플러그인으로 마이그레이션해야 합니다. 마이그레이션 가이드와 자세한 정보는 문서를 확인하십시오.

또한 kotlin-multiplatform Gradle 플러그인에서 Kotlin/Native 대상을 구성하는 API를 이전에 폐기된 API를 제거했습니다. 1.3.40부터는 compilations.outputKinds가 더 이상 지원되지 않으므로 대신 binaries API를 사용하십시오.


Interop


Kotlin/Native로 생성된 프레임워크에 대한 실험적 제네릭 지원이 포함되었습니다. 이 기능은 Objective-C/Swift용 Kotlin/Native 제네릭 클래스에 대한 제네릭 매개변수의 유형 정보를 추가합니다. 이 기능은 기본적으로 비활성화되어 있으며 활성화하려면 컴파일러에 -Xobjc-generics 명령 줄 인수를 전달하거나 Gradle 프로젝트 구성에 다음 라인을 추가하십시오:

 

kotlin {
    iosX64 {
        binaries {
            framework {
                freeCompilerArgs.add("-Xobjc-generics")
            }
        }
    }
}

 

이외에도 Kotlin의 Unit 유형이 생성된 프레임워크에서 Void로 전환됩니다. Kotlin/Native 메서드 이름은 Objective-C 선언과 충돌하지 않도록 개선되었습니다. 인터옵에서 가변 인수 Objective-C 함수도 지원됩니다.

C 인터옵에서 Nullable 문자열을 올바르게 지원합니다. 사용자 정의 예외 후크의 문제를 해결하여 코드에서 setUnhandledExceptionHook {} 함수를 사용하여 처리되지 않은 Kotlin 예외를 잡을 수 있습니다.

 

Kotlin/Native에서의 테스트


Kotlin/Native 테스트 대상을 위한 별도의 이진형 타입이 추가되었습니다. 이제 빌드에 네이티브 테스트 실행 파일을 만들도록 명령을 내릴 수 있습니다:

 

kotlin.macosX64 {
    binaries {
        test("integration") {
            /* 필요한 경우 설정 */
        }
    }
}

 

Kotlin/Native 테스트 러너는 이제 Gradle과 통합되어 Kotlin/JVM 테스트에서 사용 가능한 기능과 유사한 기능을 구현합니다. 예를 들어 테스트 실패는 콘솔에 표시되며 테스트 보고서가 생성되며 Gradle 명령 줄에 테스트 필터를 전달할 수 있습니다.

이제 Gradle API를 사용하여 테스트 이진 파일을 쉽게 얻을 수 있습니다. 예전 방식인 binaries.getExecutable("test", "DEBUG")와 같이 테스트 실행 파일을 찾는 방법은 더 이상 작동하지 않으며 대신 새 API인 binaries.getTest("DEBUG")를 사용하십시오.

 

업데이트 방법


항상 온라인에서 Kotlin을 시도할 수 있는 play.kotl.in을 사용할 수 있습니다.

  • Maven, Gradle 및 npm에서: 컴파일러 및 표준 라이브러리의 버전으로 1.3.40을 사용하십시오. 여기서 문서를 참조하십시오.
  • IntelliJ IDEA 및 Android Studio에서: Kotlin 플러그인을 버전 1.3.40으로 업데이트하십시오. Tools | Kotlin | Configure Kotlin Plugin Updates로 이동하고 "Check for updates now" 버튼을 클릭하십시오.
  • Eclipse에서: Marketplace를 통해 플러그인을 설치하십시오.
  • 명령 줄 컴파일러는 Github 릴리스 페이지에서 다운로드할 수 있습니다.

 

새 릴리스로 인한 문제가 발생하면 포럼에서 도움을 요청하거나 Slack(여기에서 초대를 받을 수 있음)에서 도움을 요청하거나 이슈 트래커에 문제를 보고할 수 있습니다.

Kotlin을 사용해 봅시다!

 

외부 기여


특히 Kotlin/Native에서 프레임워크를 생성할 때 제네릭 지원을 추가한 Kevin Galligan에게 우리는 감사의 말씀을 드립니다.

이 릴리스에 포함된 외부 기여자의 풀 리퀘스트에 기여한 외부 기여자들에게 감사의 인사를 전합니다:

  • Dimach
  • Toshiaki Kameyama
  • pyos
  • Mark Punzalan
  • Ivan Gavrilovic
  • Ting-Yuan Huang
  • Steven Schäfer
  • Burak Eregar
  • Dereck Bridie
  • Jake Wharton
  • Mads Ager
  • Kirill Knize
  • gcx11
  • Austaon
  • Ryan
  • Jan Gerling
  • Harry Billinis
  • Georgios Andrianakis
  • George Gastaldi
  • Eduard Wolf
  • Caleb Brinkman
  • Wil
  • Benjamin Orsini
  • Yanis Batura
  • ilgonmic
  • Kenji Tomita
  • Matthew Runo
  • Kirill Rakhman
  • Kevin Galligan
  • Kevin Peek
  • Kerooker
  • Juan Chen
  • Nikolay Kasyanov
  • Jorge Antonio Díaz-Benito Soriano
  • Pavel Nikitin
  • Peter Xu
  • Rene Groeschke
  • Jiaxiang Chen


이러한 외부 기여자들의 노력과 기여에 감사드립니다. Kotlin 커뮤니티의 협력은 Kotlin을 더욱 향상시키는 데 큰 도움이 됩니다.

 

원문

 

https://blog.jetbrains.com/kotlin/2019/06/kotlin-1-3-40-released/

반응형

댓글