본문 바로가기
Kotlin/Release Notes

[Kotlin Release Notes] Kotlin 1.3 RC is Here: Migrate Your Coroutines!

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

2018년 9월 20일

 
Kotlin 1.3-RC를 소개하여 자랑스럽게 발표합니다. 이것은 1.3.0을 위한 최신 미리보기 및 릴리스 후보입니다. 이 릴리스는 주로 새로운 언어 기능과 관련된 중요한 버그 수정을 포함하고 있습니다. 다른 주목할만한 변경 사항과 공지 사항은 다음과 같습니다:

  • Ktor은 API를 마무리하고 피드백을 기다리고 있습니다. Ktor은 웹 애플리케이션, HTTP 서비스, 모바일 및 브라우저 애플리케이션을 구축하기 위한 프레임워크입니다. 그것은 우아하며 비동기이며 코루틴 기반으로 구축되었습니다.
  • 공식 코드 스타일은 이제 모든 새 프로젝트에 사용됩니다. 또한 이전 프로젝트를 공식 스타일로 마이그레이션하도록 권장합니다.
  • 메인 진입점은 이제 매개 변수를 가질 필요가 없으며 서스펜딩 함수가 될 수도 있습니다.
  • 1.2.50 버전에서 도입된 스크립팅에 대한 실험적 지원이 재작업되고 개선되었습니다.
  • 실험적 kotlinx.serialization 플러그인이 Kotlin 주요 프로젝트에 병합되었습니다. 이제 이것은 번들로 제공되는 컴파일러 플러그인입니다.
  • 표준 라이브러리에는 새로운 사용 중지(deprecations)가 있으며 일부 오래된 사용 중지에 대한 오류가 있습니다.
  • org.jetbrains.annotations 패키지의 어노테이션이 표준 라이브러리에서 별도의 아티팩트로 추출되었습니다.

 


외부 기여 Toshiaki Kameyama, Cuihtlauac ALVARADO, kenji tomita, Martin Petrov, Denis Vnukov, shiraji, Paul de Vrieze, Raluca Sauciuc, Ivan Gavrilovic의 커밋이 이 릴리스에 포함되었음을 감사드립니다.

이 릴리스의 전체 변경 목록은 변경 로그에서 찾을 수 있습니다. 릴리스 후보와 관련된 새로운 기능 또는 발생할 수 있는 문제에 대한 피드백을 환영합니다. Kotlin 1.3.0의 최종 릴리스가 곧 다가오므로 피드백을 제공하기에는 최적의 시기일 수 있습니다.
 

KotlinConf 2018 온라인


주요 Kotlin 이벤트인 KotlinConf가 거의 다가옵니다! 올해 컨퍼런스에 참석하지 못하는 분들을 위해 주요 연설, 마감 패널 및 전체 트랙을 2일 동안 라이브 스트리밍할 예정입니다. 라이브로 알림을 받으려면 라이브로 가기 버튼을 눌러 등록하세요!
 

코루틴을 마이그레이션할 시간


Kotlin 1.3에서 코루틴을 안정적인 상태로 업그레이드합니다. 이제 오래된 실험적 코루틴을 사용하는 라이브러리를 1.3.0이 나올 때까지 업그레이드할 좋은 시기입니다. 당사의 도구는 코드를 마이그레이션하는 데 도움을 줄 것입니다.

실험적 kotlinx.coroutines 라이브러리를 사용하는 사용자의 마이그레이션 경로는 다음과 같습니다. 현재 실험 버전인 0.26.1로 코드를 업데이트해야 하며 Kotlin 1.3로 프로젝트를 변경한 다음 IDE 도구가 Kotlin 1.3용으로 빌드된 0.26.1-eap13 버전으로 마이그레이션하는 데 도움을 줍니다. 이 마이그레이션은 기계적으로 이루어지며 실험적 패키지 이름에서 실험적을 제거하는 것으로 구성됩니다. kotlinx.coroutines 버전 1.0.0은 Kotlin 1.3 릴리스와 함께 출시될 예정이며 버전을 1.0으로 변경하고 코드를 다시 컴파일하기만 하면 됩니다. kotlinx.coroutines 릴리스에서는 실험적 0.x 릴리스의 모든 사용 중지된 선언을 삭제하고 0.x-eap13 릴리스에서 사용 중지된 API 사용을 정리해야 하므로 프로젝트가 최신 0.x 버전인 동안 이에 대한 대체 사항을 따르도록 해야 합니다. kotlinx.coroutines의 일부 API는 나중에 업데이트로 안정화되기 위해 불안정하게 표시될 예정입니다. 불안정한 API를 사용하려면 선택 사항으로 opt-in 플래그가 필요하지만, 코루틴을 시작하고 처리하기 위해 필요한 모든 핵심 API는 1.0에서 최종 버전으로 안정화되며 Kotlin 표준 라이브러리와 동일한 표준으로 역호환성을 유지할 예정입니다.


매개 변수 없는 메인


다른 성공적인 프로그래밍 언어의 경험을 따라 1.3에서는 메인 함수의 문자열 배열 매개 변수를 선택 사항으로 만듭니다. 이는 Kotlin에서의 "Hello, World!" 프로그램이 이제 다음과 같이 짧아진다는 것을 의미합니다:
 

fun main() {
    println("Hello, World!")
}

 

suspend 메인 함수


메인 진입점은 이제 매개 변수 없이 사용할 수 있을 뿐만 아니라 서스펜딩 함수가 될 수도 있습니다. 이는 메인에서 runBlocking 내부에 모든 것을 래핑할 필요 없이 메인에서 다른 서스펜딩 API를 호출할 수 있다는 것을 의미합니다.
 

suspend fun main() = coroutineScope {
    val task1 = async { fetchResult(id = 42) }
    val task2 = async { fetchResult(id = 99) }

    val results = awaitAll(task1, task2)

    log(results)
}

 

Ktor 프레임워크


Kotlin 코루틴이 실험적 상태에서 벗어남에 따라 우리는 미래의 호환성 문제를 걱정 없이 비동기 라이브러리를 릴리스할 수 있게 되었습니다. 우리는 여러분을 위해 유용한 많은 기능을 준비했는데, 그 중 하나가 Ktor입니다. Ktor은 연결된 애플리케이션을 위한 비동기 프레임워크로, 멀티플랫폼 HTTP 클라이언트와 JVM 기반 HTTP 서버를 특징으로 합니다.

현재 클라이언트는 JVM/Android 및 iOS에서 사용할 수 있으며, 브라우저와 다양한 네이티브 플랫폼을 포함한 기타 플랫폼으로 확장 지원할 계획입니다. 서버는 JVM에서 실행되며 Netty, Jetty 또는 Tomcat과 같은 서블릿 엔진을 사용할 수 있습니다.

Ktor 프레임워크는 사용하기 쉽고 테스트가 완벽하며 고성능이며 즉시 시작되며 모든 것이 컨테이너 친화적입니다. 자세한 내용은 https://ktor.io/에서 확인할 수 있습니다. 최신 비트와 호환되는 Kotlin 1.3-RC용 0.9.5-rc13 버전 또는 최신 비트와 호환되는 Kotlin 1.2.70용 0.9.5 버전을 사용하여 오늘 바로 시도해 볼 수 있습니다.


코드 스타일


우리는 공식 코딩 컨벤션 가이드를 소개한지 어느 정도 시간이 지났으며 이제 더 나아가는 시기입니다. Kotlin 1.3부터 IntelliJ IDEA에서 생성한 모든 새 프로젝트는 코드 스타일 설정을 사용하여 공식 코딩 컨벤션을 준수하도록 구성됩니다.

우리는 .idea/codeStyles 디렉토리를 VCS를 통해 공유하는 것을 권장하지만 일부 사람들은 그렇게 하기를 원치 않을 수 있으므로 Gradle 속성인 kotlin.code.style을 도입했습니다. 이 속성은 IDE 가져오기 중에 프로젝트 기본 설정, 공식 또는 사용 중지된 설정을 설정하는 데 사용할 수 있습니다. Maven에서도 동일한 속성을 사용할 수 있습니다.

이전 코드 스타일을 유지하려면 향후 Kotlin 릴리스에서 실수로 마이그레이션을 피하기 위해 프로젝트에 kotlin.code.style=obsolete 설정을 지정하십시오. Maven에서도 동일한 속성을 사용할 수 있습니다.


스크립팅


이 릴리스는 실험적인 스크립팅 지원에 많은 변경 사항을 가져왔습니다.

가장 중요한 부분은 크게 개선된 API입니다. API를 더 간단하고 깨끗하게 만들려고 노력했습니다. 스크립팅은 여전히 실험적 상태로 유지되지만 현재 형태에서의 API가 일반적으로 어떻게 보여야 하는지에 대한 우리의 생각입니다.

사용되지 않는 부분과 아직 구현되지 않은 부분 및 기능은 API에서 제거되었습니다. 다음 릴리스에서 제대로 된 구현과 함께 많은 부분과 기능을 추가할 계획입니다.

새로운 공개 아티팩트인 kotlin-main-kts가 있습니다. 이 아티팩트는 스크립트 정의와 최소한의 메이븐 아티팩트 리졸버를 단일 JAR에 포함하고 있습니다. 이것의 목적은 외부 라이브러리에 의존하는 간단한 유틸리티 스크립트의 생성 및 사용을 단순화하는 것입니다. 예를 들어 다음과 같은 스크립트를 작성할 수 있습니다:
 

@file:Repository("https://jcenter.bintray.com")
@file:DependsOn("org.jetbrains.kotlinx:kotlinx-html-jvm:0.6.11")

import kotlinx.html.*
import kotlinx.html.stream.*

print(createHTML().html {
    body {
        h1 { +"Hello, World!" }
    }
})

 
그런 다음 다음과 같이 kotlin-main-kts.jar만 클래스 패스에 지정하여 실행할 수 있습니다.
 

kotlinc -cp <path/to/kotlin-main-kts.jar> -script sample.main.kts

 
이 릴리스에서 스크립팅 지원과 관련된 다른 수정 및 개선 사항이 많이 있습니다. 예제를 확인하고 시도해보고 피드백을 주시기를 권장합니다. 현재 구현 상태와 함께 Kotlin 스크립팅 제안 전체 내용은 적절한 KEEP-75에서 찾을 수 있습니다.


실험적 직렬화 플러그인


이 릴리스부터 kotlinx.serialization 컴파일러 플러그인이 이제 Kotlin 컴파일러에 번들로 제공됩니다. 이렇게 함으로써 안정성을 향상시키고 플러그인이 지원하는 모든 플랫폼에서 동일한 동작을 보장합니다.

직렬화 컴파일러 플러그인은 Kotlin 1.3에서 여전히 실험적 상태이지만 실제 프로젝트에서 사용하기에 충분히 성숙하며 여러분의 피드백이 필요합니다. 플러그인 아키텍처에 대한 설명이 포함된 공개 제안서인 KEEP-149를 확인하고 문제에 대한 의견/제안을 공유해 주시기 바랍니다.


인라인 클래스


인라인 클래스의 바이너리 표현을 더 간결하고 미래 지향적으로 변경하고 남아있는 몇 가지 중요한 문제를 해결했습니다.

Kotlin 리플렉션은 이제 시그니처에서 인라인 클래스 유형을 올바르게 처리하고 묵시적으로 상자/언박싱 메서드를 자동으로 호출합니다.


표준 라이브러리


이 마일스톤은 새로운 기능보다는 릴리스 전 정리에 중점을 두고 있습니다.


nullable 타입에 대한 hashCode()


일반적인 컨테이너를 구현할 때, 제약되지 않는 nullability를 갖는 제네릭 요소의 해시 코드를 가져오는 일반적인 작업입니다. 해당 요소가 null일 수 있으므로 요소?.hashCode() ?: 0과 같은 안전한 호출 및 엘비스 연산자가 필요했습니다.

우리는 이제 Any?.hashCode() 함수를 도입하고 이 일반적인 패턴을 실현합니다. 결과적으로 위의 표현식은 element.hashCode()로 단순화됩니다.


iterable 범위에서 nullable 요소 확인


범위 체크 표현식 value in from..to는 값이 nullable이고 범위 from..to가 iterable 및 큰 경우 크게 느려질 수 있습니다. 이 경우 Iterable<T>.contains(T) 오버로드가 이 작업을 위해 선택되어 값이 찾힐 때까지 또는 결코 발견되지 않을 때까지 범위를 반복하는 결과가 나타납니다.

이제 null을 체크하고 빠른 경로 'contains' 체크를 실행하는 IntRange.contains(element: Int?)와 같은 여러 오버로드를 도입했습니다.


SuccessOrFailure가 Result로 이름이 변경됨


Kotlin 1.3의 미리보기 빌드에서 릴리스된 Kotlin 함수의 성공 또는 실패 결과를 캡슐화하는 클래스는 원래 SuccessOrFailure이라는 작업 이름으로 출시되었습니다. 이 클래스는 주로 코루틴에서 Continuation.resumeWith 함수의 인수 유형으로 사용됩니다. Kotlin의 미래 확장에 대한 잠재적인 설계 리딩이 있으므로 향후 코드가 깨지지 않도록하기 위해 Kotlin 1.3 컴파일러는 일부 표준 라이브러리 함수의 예외를 제외하고 이러한 Result 클래스를 반환 유형으로 사용할 때 오류를 발생시킵니다. 자세한 내용은 KEEP-127을 참조하십시오.


시퀀스 및 이터레이터 빌더 함수 및 해당 스코프 클래스


코루틴 API가 표준 라이브러리에서 최종 상태로 완료되기 전에 빌드 시퀀스 및 빌드 이터레이터 함수의 이름을 변경하기로 결정했습니다.

현재 이름은 빌드 문자열 함수 및 기본 컬렉션용 빌더 함수와 일관성을 갖기 위해 선택되었습니다. 그러나 최근에 시퀀스와 문자열 빌더 함수는 게으르기 측면에서 매우 다르다는 것을 깨달았으며 그 일관성은 실제로 원하지 않는 것입니다.

시퀀스 빌더는 buildSequence { }와 buildIterator { }에서 sequence { } 및 iterator { }로 변경되었습니다. 빌더에 전달되는 함수의 수신자 유형은 이제 SequenceScope가 아닌 SequenceBuilder입니다.

결과적으로 시퀀스 빌더와 관련된 코드는 다음과 같이 보입니다:
 

fun idCandidates(baseId: String): Sequence<String> = sequence {
    yield(baseId)
    for (suffix in 'a'..'z') {
        yield(baseId + "-" + suffix)
    }
}

 

부호 있는 정수에서 부호 없는 정수로 확장 변환은 이제 부호 확장을 수행합니다.


부호 있는 정수를 부호 없는 더 넓은 정수로 변환하는 방식을 변경하여 다른 언어에서 부호 없는 타입을 지원하는 방식과 일관성 있게 만들고 있습니다.

Int.toULong() 함수 및 유사한 함수는 이제 0 확장 대신 부호 확장을 수행하므로 (-1).toULong()은 UInt.MAX_VALUE (0x0000_0000_FFFF_FFFF) 대신 ULong.MAX_VALUE (0xFFFF_FFFF_FFFF_FFFF)와 같습니다.

변경된 부분은 더 넓은 부호 없는 정수로 서명을 변환할 때 확장 변환 작업입니다. 이제 (-1).toULong()은 UInt.MAX_VALUE 대신 ULong.MAX_VALUE로 변환됩니다.


가변성 주석을 별도의 아티팩트로 이동


컴파일러와 함께 배포되는 표준 라이브러리 아티팩트에서 org.jetbrains.annotations 패키지의 주석은 표준 라이브러리 아티팩트에서 제외되었습니다. 이러한 주석은 컴파일러 배포에서 annotations-13.0.jar 및 mutability-annotations-compat.jar에서 찾을 수 있습니다.
 

혼합 정수/부동 소수점 컨테인스 연산자를 범위에 대해 사용 중단


이전에 언급한 nullable 요소의 문제적 'contains' 체크 이외에도 정수 경계로 이루어진 범위에서 floating point 인수 또는 그 반대의 경우에 문제가 발생했습니다. 1.14에서의 체크 3.14 in 1..3은 작동하지만 진실로 평가되는 반면 counter-intuitive한 결과를 생성했습니다. 그러한 contains 연산자 오버로드를 사용 중단 처리하고 향후 Kotlin 버전에서 제거할 예정입니다.
 

다른 폐기 알림


폐기 주기를 계속 진행하며 이전에 폐기된 API의 폐기 수준을 높였습니다. 이제 이러한 API의 사용은 경고가 아닌 오류를 발생시킵니다.

이 버전에서 언급된 폐기된 API는 JS의 표준 라이브러리에서 다음과 같습니다:

  • jsClass 함수
  • kotlin.Synchronized 및 Volatile 주석
  • kotlin.js.Math 함수
  • kotlin-test-js의 org.junit.Test 주석


이러한 이름이 익숙하지 않다면 걱정하지 마십시오. 익숙하다면 제안된 대체 방법에 따라 사용법을 마이그레이션하십시오.

다음 릴리스에서는 1.4에서 표준 라이브러리에서 jQuery 형식 선언을 제거할 예정입니다. 패키지 https://bintray.com/kotlin/js-externals/kotlin-js-jquery에서 외부 선언으로 마이그레이션하십시오.


Command-line 컴파일러


이 릴리스에서는 파일에서 컴파일러 인수를 전달하는 대체 방법을 추가했습니다. Kotlin 1.2.50에 도입된 -Xargfile=filename.txt 형식 대신에 이제 kotlinc에 @filename.txt를 인수로 전달할 수 있으며, 이를 인수로 사용하면 파일 내용을 한 줄씩 인수로 해석합니다. 이를 통해 kotlinc를 사용하여 대량의 소스 파일 또는 긴 경로가 있는 소스 파일을 컴파일할 수 있습니다.

이 릴리스에서 하나의 실험적인 기능이 졸업했습니다 (1.2.50에서 도입됨) 이제 -progressive 플래그를 통해 사용할 수 있습니다.


이를 시도하는 방법


Maven/Gradle에서: 빌드 스크립트와 프로젝트에 https://dl.bintray.com/kotlin/kotlin-eap를 저장소로 추가하십시오. 컴파일러 플러그인과 표준 라이브러리의 버전 번호로 1.3.0-rc-57을 사용하십시오.

IntelliJ IDEA에서: 도구 → Kotlin → Kotlin 플러그인 업데이트 구성으로 이동하여 업데이트 채널 드롭다운 목록에서 "Early Access Preview 1.3"을 선택한 다음 업데이트를 확인하십시오.

Command-line 컴파일러는 Github 릴리스 페이지에서 다운로드할 수 있습니다.

try.kotlinlang.org에서: 오른쪽 하단의 드롭다운 목록을 사용하여 컴파일러 버전을 1.3‑RC로 변경하십시오.
 

원문

 
https://blog.jetbrains.com/kotlin/2018/09/kotlin-1-3-rc-is-here-migrate-your-coroutines/

반응형

댓글