Releases

Kotlin 1.6.0 출시

Read this post in other languages:
English, Français, Deutsch, Русский, 简体中文

새롭게 공식 출시된 Kotlin 1.6.0에는 안정화가 완료된 when, Kover 및 Kotlin/Native용의 새로운 메모리 관리자가 포함되어 있습니다. 1.5.30에 출시된 다른 언어 및 표준 라이브러리 기능도 안정화 단계로 넘어왔습니다. 의견을 보내주신 모든 분들께 감사드립니다. 아직 이 새로운 기능을 사용해 보지 않았다면 지금 사용해 보세요!

이 블로그 글에서는 다음 업데이트에 대한 개요를 확인할 수 있습니다.

  • 언어 기능: sealed when 문, 일시중지 함수 및 일시중지 변환, 어노테이션 클래스의 인스턴스화, 향상된 일반 타입 추론 및 빌더 타입 추론.
  • Kotlin/JVM: 위임 프로퍼티와 반복 가능한 어노테이션 최적화.
  • Kotlin/Native: 테스트 버전의 새 메모리 모델, Xcode 13 지원, Windows 대상의 교차 컴파일, LLVM 및 링커 업데이트, 성능 업데이트, 통합 컴파일러 플러그인 ABI.
  • Kotlin/JS: Node.js 및 Yarn 다운로드를 비활성화하는 옵션.
  • Kover 발표.
  • 표준 라이브러리: 표준 입력을 위한 새로운 함수, 안정화된 typeOf(), 안정화된 Duration API 및 기타 안정화된 stdlib 함수.

블로그를 구독하여 Kotlin 업데이트를 놓치지 마세요.

업데이트 방법

IntelliJ IDEA 또는 Android Studio를 사용하는 경우, 새로운 Kotlin 릴리스가 출시되는 즉시 자동으로 업데이트할 수 있는 옵션이 제공됩니다.

Kotlin 1.6.0 설치 방법에 대해 자세히 알아보세요.

Kotlin 1.6.0으로 업데이트

언어 기능

여러분의 피드백을 기반으로 Kotlin 1.5.30의 기능을 안정화했습니다.

(완전한) sealed when

sealed when오랫동안 기다려온 기능으로, when 문이 완전하지 않은 경우 Kotlin 컴파일러에서 경고합니다. 덕분에 자체 함수를 삽입하지 않고도 코드를 더 안전하게 만들 수 있습니다. 

Kotlin은 sealed 클래스, 열거형 및 부울 타입에 대한 when 을 항상 완전하게 확인했습니다. 이는 이러한 대수 데이터 형식으로 도메인을 모델링할 때 특히 도움이 되는 기능입니다. 예를 들어 sealed 클래스 계층 구조로 모델링된 앱의 경우 사용자마다 연락처를 상이하게 설정할 수 있습니다.

이때 연락처 환경 설정에 따라 다른 결과를 반환하는 표현식을 작성하였으나 깜박 잊고 앱에 있는 모든 타입을 처리하지 않은 경우, 이제 컴파일러에서 오류를 표시합니다.

이는 코드 작성과 향후 유지 관리에 큰 도움을 줍니다. 나중에 다른 타입의 연락처 환경 설정을 추가하더라도, 코드 전체에 걸쳐 다양한 타입의 연락처 환경 설정을 잊지 않고 처리하도록 컴파일러에서 알려줄 것이므로 안심할 수 있습니다.

Kotlin 1.6 이전에는 컴파일러가 사용자에게 인스턴트 메시지 알림을 보내는 것을 완전히 잊어버려도 when 을 사용하는 다음 코드가 성공적으로 컴파일되었습니다.

이때는 컴파일러로부터 어떤 메시지도 없이 약한 IDE 검사만 보고되었습니다. Kotlin 1.6부터는 다음 컴파일러 경고가 발생합니다.

Non-exhaustive 'when' statements on sealed class/interface will be prohibited in 1.7. Add an 'is InstantMessage' branch or 'else' branch instead.

Kotlin 1.7에서는 이것이 오류로 취급되므로 실수로 잊어버릴 가능성이 없습니다. 변경 사항과 그 영향에 대한 자세한 설명은 KT-47709를 참조하세요. 

상위 타입으로서 일시중지 함수

Kotlin 1.6은 suspend 함수 타입을 상위 인터페이스로 구현하는 것에 대한 지원을 안정화했습니다. 이 부분은 Kotlin 코루틴 설계에서 누락된 부분 중 하나였습니다. 

Kotlin API를 설계하면서 다양한 라이브러리 함수의 동작을 사용자 지정해야 할 때에는 함수 타입을 수용하는 것이 관용적입니다. 예를 들어, kotlinx.coroutines API의 Job 인터페이스에는 다음과 유사한 멤버 함수가 있습니다.

이 함수는 invokeOnCompletion { doSomething() }과 같은 람다와 함께 편리하게 사용할 수 있습니다. 코드 완성을 처리하려는 클래스가 있는 경우, 추가 람다를 생성하지 않고 클래스에서 바로 함수 타입 () -> Unit을 구현하여 코드를 간소화하고 최적화할 수 있습니다.

Kotlin 1.6부터 이 최적화는 일시중지 함수로 가능합니다. 해당 API에서 다음과 같은 일시중지 함수 타입을 허용하는 경우:

…더 이상 이 코드에 람다와 일시중지 함수 참조를 전달하는 것에 제한받지 않습니다. 클래스에서 그에 해당하는 일시중지 함수 타입을 구현할 수도 있습니다.

일시중지 변환

Kotlin 1.6은 일반 함수 타입에서 일시중지 함수 타입으로의 변환을 안정화했습니다. 이제 일시중지가 필요한 적절한 일반 함수 타입의 표현식을 매개변수로서 전달할 수 있습니다. 변환은 컴파일러에서 자동으로 수행합니다.

그 결과 Kotlin에서 일반 함수와 일시중지 함수 간의 상호작용에 있었던 사소하지만 성가신 불일치 문제가 해결됩니다. Kotlin Flow의 collect 호출과 같이 일시중지 함수를 허용하는 고차 함수가 있는 경우, 다음처럼 이를 호출하기 위해 람다를 사용하는 대신:

processItem 함수에 대한 참조를 collect 호출에 전달하여 동일한 효과를 내는 것이 편리하다는 것을 알 수 있을 겁니다.

그런 다음 코드의 동작을 사용자 지정하기 위해 처리 함수에 대한 참조를 변수로 추출합니다. 그러나 1.6 이전의 Kotlin 버전에서는 이것이 가능하지 않았습니다. 일시중지 타입의 매개변수로서 전달되는 일반 함수가 있기 때문입니다.

Kotlin 1.6에서는 위의 코드도 컴파일되고 잘 작동합니다.

재귀적 제네릭 타입에 대한 타입 추론 개선

1.6.0부터 Kotlin 컴파일러는 기본적으로 재귀적 제네릭인 경우에 해당 타입 매개변수의 상위 바운드만 고려하여 타입 인수를 추론할 수 있습니다. 이에 따라 빌더 API를 만들기 위해 Java에서 자주 사용되는 재귀적 제네릭 타입으로 다양한 패턴을 생성할 수 있게 됩니다.

빌더 추론 개선 사항

Kotlin 1.5.30에서는 -Xunrestricted-builder-inference 컴파일러 옵션을 도입하여 빌더 호출에 대한 타입 정보를 빌더 람다 내부로 가져올 수 있었습니다. 즉, buildList() 람다 내부의 get()과 같이 아직 추론되지 않은 타입의 인스턴스를 반환하는 호출을 만들 수 있게 했습니다.

1.6.0부터는 이전에 금지된 호출을 수행하기 위해 -Xunrestricted-builder-inference를 지정할 필요가 없습니다. -Xenable-builder-inference 컴파일러 옵션을 사용하면 이제 @BuilderInference 어노테이션을 적용하지 않고 고유한 일반 빌더를 작성할 수 있으며 일반 타입 추론으로 타입 정보를 확인할 수 없는 경우에 빌더 추론을 자동으로 활성화할 수 있습니다.

이전 API 버전을 더 오래 지원

Kotlin 1.6.0부터 이제 두 개가 아니라 세 개의 이전 API 버전(현재 안정화 버전 포함)을 개발에 사용할 수 있습니다. 현재 여기에는 API 버전 1.3, 1.4, 1.5 및 1.6이 포함됩니다.

Kotlin/JVM

런타임 보존 기간이 있는 반복 가능한 어노테이션. Java 8과 같이 Kotlin에는 반복 가능한 어노테이션이 있습니다. Kotlin 1.6에서는 이 기능이 Java와 호환되며 @kotlin.annotation.Repeatable은 이제 모든 보존을 허용하고 어노테이션을 Kotlin과 Java 모두에서 반복 가능하게 만듭니다. 또한 Java의 반복 가능한 어노테이션이 Kotlin에서도 지원됩니다.

Kotlin/Native

이제 새로운 Kotlin/Native 메모리 관리자의 실험 버전을 사용해 볼 수 있습니다. 이 기능을 통해 멀티플랫폼 프로젝트에서 일관된 개발자 경험을 제공한다는 목표에 한 걸음 더 가까이 다가가게 되었습니다. 즉, 새로운 메모리 관리자가 스레드 간의 객체 공유에 대한 기존 제한을 없애고, 개발자가 특별히 관리하거나 어노테이션을 추가할 필요 없이 안전하고 누수가 전혀 없는 동시 프로그래밍의 기본을 제공합니다.

이제 Kotlin/Native가 Xcode 13을 지원하므로 Xcode를 자유롭게 업데이트하고 Kotlin 프로젝트 작업을 계속 이어갈 수 있습니다. 

모든 호스트에서 Windows 대상 컴파일. Kotlin/Native를 지원하는 모든 호스트에서 Windows 대상 mingwX64mingwX86을 컴파일할 수 있습니다.

Kotlin/Native에서 내부적으로 사용되는 LLVM 종속 요소를 개편했습니다. 그 결과, LLVM 버전이 11.1.0으로 업데이트되고 종속 요소의 크기가 줄었으며, 이와 함께 몇 가지 이점이 생겼습니다.

JVM 및 JS IR 백엔드를 포함한 통합 컴파일러 플러그인 ABI. Kotlin/Native용으로 JVM 및 JS IR 백엔드에서 사용되는 임베드 가능한 컴파일러 jar를 이제 Kotlin Multiplatform Gradle 플러그인에서 사용할 수 있습니다. 또한 Native 및 기타 지원되는 플랫폼에 대해 동일한 컴파일러 플러그인 아티팩트를 사용할 수 있습니다.

Kotlin/JS

인터넷 연결이 없는 서버에서 빌드하기 위해 이제 Kotlin/JS 프로젝트를 위한 Node.js 및 Yarn 다운로드를 비활성화하고 호스트에 이미 설치된 인스턴스를 사용할 수 있습니다.

Kover

첫 릴리스 이후 코드 커버리지를 정확히 측정하는 일이 숙제로 남아 있었습니다. JaCoCo와 같은 일부 훌륭한 도구는 Kotlin 코드와는 잘 작동하지만 Gradle 툴체인 및 멀티플랫폼 프로젝트와는 완전히 통합되지 않습니다. 이번 Kotlin 릴리스에서는 이 문제를 해결하기 위해 첫 발을 내딛었습니다. Kotlin/JVM 컴파일러로 빌드된 Kotlin 코드의 코드 커버리지를 측정하는 새로운 Gradle 플러그인인 Kover를 만나보세요. 아직은 초기 개발 단계로 실험적 수준에 있으니 이에 대한 의견을 GitHub로 보내주시면 감사하겠습니다.

자세한 내용은 Kover 동영상을 시청하세요.

표준 라이브러리

Kotlin 1.6.0은 readLine() 뒤의 !!를 제거하고, typeOf()를 안정화하며, 안정화된 Duration API를 제공함으로써 stdlib 로드맵의 세 단계를 마무리했습니다. 또한 다음 stdlib 함수도 안정화 단계로 승격했습니다.

  • 컬렉션 빌더
  • 정수에 대한 비트 회전 연산
  • 문자열을 시퀀스로 분할하는 정규식 함수

또한 중위 표기법으로 compareTo를 호출하는 기능을 추가하고 JVM 및 JS에서 replace() 함수를 일관되게 사용할 수 있도록 했습니다.

표준 입력을 위한 새로운 함수

Kotlin 1.6.0에서는 표준 입력에서 한 줄을 읽은 후 null이 아닌 어설션 연산자 !!를 사용할 필요가 없도록 하여 초보자의 학습 경험을 개선하고 Kotlin 교육을 수월하게 만들었습니다.

콘솔에서 읽기용 함수가 새롭게 제공되어 다음과 같은 환경이 마련됩니다.

  • readln()은 EOF에 도달하면 예외를 던집니다. !! 연산자로 null에 대한 readLine()의 결과를 확인하는 대신 이 함수를 사용하세요.
  • 새로운 readlnOrNull()null을 반환하는 대체 함수입니다. 이전의 readLine()과 작동하는 방식이 동일하지만 이해하기 쉬운 이름을 가지고 있습니다.

이러한 함수를 이제 JVM 및 Native에서 사용할 수 있습니다. 이러한 함수에 대한 명명 규칙이 이제 println()의 경우와 일치하므로, 특히 신규 사용자의 혼동을 줄이는 데 도움이 될 것입니다.

안정화된 Duration API

여러분의 의견 덕분에 Duration API를 안정화 단계로 진행하고 해당 로드맵 항목을 완료했습니다.

가독성이 높아진 Duration.toString() 출력, 1.5.30에서 테스트 버전으로 제공된 String의 Duration 분석을 위한 새로운 함수와 더불어 Duration API에 다음과 같은 변경 사항이 적용되었습니다.

  • 값이 잘리는 것을 방지하기 위해 toComponents 함수의 days 구성 요소에 Int 대신 Long 타입이 사용됩니다.
  • DurationUnit 열거형은 이제 타입 별칭이 아닙니다. JVM에서 java.util.concurrent.TimeUnit의 타입 별칭으로 이 열거형을 사용하는 경우는 없습니다.
  • 커뮤니티의 의견을 반영하여 Int.seconds와 같은 확장 프로퍼티를 다시 복원했습니다. 적용 범위를 제한하기 위해 Duration 클래스의 컴패니언에서만 사용할 수 있습니다.

안정화된 typeOf()

Kotlin 1.6.0에서는 typeOf()안정화 단계로 넘어왔으며 해당 로드맵 항목이 완료되었습니다. 1.3.40부터 JVM 플랫폼에서 실험적인 API로 제공되었던 typeOf()를 이제 모든 Kotlin 플랫폼에서 사용할 수 있게 되었으며 컴파일러가 추론할 수 있는 모든 Kotlin 타입의 KType 표현을 얻을 수 있습니다. 

컬렉션 빌더 안정화

Kotlin 1.6.0에서는 컬렉션 빌더 함수인 buildMap(), buildList()buildSet()안정화 단계로 진행되었습니다. 빌더에서 반환된 컬렉션을 이제 읽기 전용 상태에서 직렬화할 수 있습니다.

안정화된 정수 비트 회전 연산

Kotlin 1.6.0에서는 지정된 비트 수만큼 숫자의 2진 표현을 왼쪽 또는 오른쪽으로 회전하는 rotateLeft()rotateRight() 함수가 안정화 단계로 넘어왔습니다.

문자열을 시퀀스로 분할하는 정규식 함수 안정화

Kotlin 1.6.0에서는 또한 문자열을 시퀀스로 분할하는 정규 표현식 함수인 splitToSequence()가 안정화 단계로 넘어왔습니다.

중위 표기법의 compareTo

순서 지정 목적으로 두 객체를 비교하기 위해 중위 표기법으로 Comparable.compareTo 함수를 호출하는 기능을 추가했습니다. 

JVM 및 JS에서 일관된 replace() 및 replaceFirst()

Kotlin 1.6.0 이전에는 대체 문자열에 그룹 참조가 포함된 경우 replace()replaceFirst() 정규식 함수가 JVM 및 JS에서 다르게 작동했습니다. 이제 Kotlin/JS에서의 동작이 JVM에서의 동작과 일치합니다.

​​호환성

모든 기능 릴리스와 마찬가지로, 이전에 발표되었던 변경 사항의 지원 중단 주기 중 일부가 Kotlin 1.6.0에서 종료됩니다. 이러한 사례는 언어 위원회에서 모두 신중하게 검토한 후 Kotlin 1.6 호환성 가이드에 표시됩니다. YouTrack에서 이러한 변경 사항을 살펴볼 수도 있습니다.

Kotlin 1.6.0 설치 방법

IntelliJ IDEA 또는 Android Studio를 사용하고 있는 경우 IDE에서 자동으로 Kotlin을 1.6.0으로 업데이트할 것을 제안합니다. 또는 이 지침을 따라 직접 업데이트할 수도 있습니다.

다음 IDE의 최신 버전을 다운로드하여 광범위한 Kotlin 지원을 받을 수 있습니다.

  • IntelliJ IDEA – 다양한 플랫폼을 위한 Kotlin 애플리케이션 개발 지원
  • Android Studio – Android 및 크로스 플랫폼 모바일 애플리케이션 개발 지원

또한 kotlinx 라이브러리를 호환되는 버전으로 업데이트하고 기존 프로젝트의 빌드 스크립트에 Kotlin 1.6.0을 지정했는지 확인하세요.

명령줄 컴파일러가 필요한 경우, Github 릴리스 페이지에서 다운로드하세요.

문제가 발생한 경우:

최신 Kotlin 기능에 대한 최신 정보를 받아보세요! 이 게시물의 오른쪽에 있는 양식을 작성하시면 Kotlin 업데이트를 받아보실 수 있습니다.

기타 유용한 글과 영상

YouTrack에서 가장 열성적으로 활동한 이슈 보고자 

Ryan Nett(48개 이슈), Zac Sweers(22개 이슈), Tianyu Geng(18개 이슈), zhelenskiy(18개 이슈), Thodoris Sotiropoulos(15개 이슈), AndroidDeveloperLB(14개 이슈), Morgan, Bartholomew(14개 이슈), Mikhail Naftal(14개 이슈), Louis CAD(12개 이슈), Philip Wedemann(12개 이슈), Victor Turansky(11개 이슈), Igor Wojda(11개 이슈), Martin Bonnin(11개 이슈), Iaroslav Postovalov(11개 이슈), Cedric(10개 이슈), (9개 이슈), Ben Woodworth(8개 이슈), Tianyi Guan(8개 이슈), Chris Povirk(8개 이슈), Alon Albert(8개 이슈).

외부 기여자

이 릴리스에 포함된 풀 리퀘스트를 제공해 주신 모든 기여자께도 감사의 마음을 전합니다. Pyos, Tianyu Geng, Jinseong Jeon, Steven Schäfer, Mark Punzalan, Hung Nguyen, Mads Ager, Ting-Yuan Huang, Matthew Gharrity, Ivan Gavrilovic, Xin Wang, ov7a, Jiaxiang Chen, Yigit Boyar, Bingran, bracadabra, Steffi Stumpos, Andrey Kuleshov.

이 게시물의 원문 작성자

Jessie Cho

Alina Grebenkina

Discover more