Releases

Kotlin 1.5.0-RC 출시: 표준 및 테스트 라이브러리 변경 사항

Read this post in other languages:
English, Français, 日本語, Deutsch, Português do Brasil, Русский, Español, 简体中文

Kotlin 1.5.0-RC는 1.5.0에 계획된 모든 기능과 함께 사용할 수 있습니다. 향후 릴리스의 전체 내용을 확인하세요! 새로운 언어 기능, stdlib 업데이트, 향상된 테스트 라이브러리 등 다양한 변경 사항이 마무리 단계에 있습니다. 마지막으로 수정 사항만 더해지면 출시 준비가 끝납니다.

1.5.0-RC를 활용해 실제 프로젝트에서 최신 Kotlin API를 사용해 보고 릴리스 버전을 개선할 수 있도록 피드백을 보내주세요! 발견한 모든 문제는 이슈 트래커 YouTrack에 보고해 주세요.

1.5.0-RC 설치

이 게시물에서는 1.5.0-RC의 Kotlin 표준 및 테스트 라이브러리 변경 사항을 안내합니다.

이어서 각각에 대한 자세한 내용을 알아보세요!

안정적인 부호 없는 정수 유형

표준 라이브러리에는 음수가 아닌 정수 연산을 처리하는 데 유용한 부호 없는 정수 API가 포함되어 있습니다. 이 버전에는 다음의 기능이 포함되어 있습니다:

  • 부호 없는 숫자 유형: UInt, ULong, UByte, UShort 및 관련 함수(예: 변환).
  • 집계 유형: 부호 없는 정수의 배열, 범위 및 진행: UIntArray, UIntRange 및 기타 유형에 대한 유사 컨테이너.

부호 없는 정수 유형은 Kotlin 1.3 이후 베타에서 사용할 수 있었습니다. 이제 부호 없는 정수 유형과 연산을 안정적인 것으로 분류하여 별도의 선택 과정 없이 실제 프로젝트에서 안전하게 사용할 수 있습니다.

새로 도입된 안정적 API는 다음과 같습니다.

  • 부호 없는 정수 유형
  • 부호 없는 정수 유형의 범위와 진행
  • 부호 없는 정수 유형으로 작동하는 함수

부호 없는 정수의 배열은 베타 버전에서 유지됩니다. 배열이 기본적으로 지원되는 부호 없는 정수 varargs도 마찬가지입니다. 코드에서 이 부분을 사용하려면 @ExperimentalUnsignedTypes 어노테이션을 넣어야 합니다.

Kotlin에서 부호 없는 정수에 대해 자세히 알아보세요.

java.nio.file.Path API용 확장 기능

Kotlin은 이제 java.nio.file.Path의 확장 함수를 통해 Kotlin 관용 스타일에서 최신의 블록되지 않은 Java IO를 즉시 사용할 수 있는 방법을 제공합니다.

다음은 간단한 예입니다.

이러한 확장 기능은 Kotlin 1.4.20에서 실험적 기능으로 도입되었으며, 이제 별도의 선택 없이 사용할 수 있습니다. 사용할 수 있는 함수 목록은 kotlin.io.path 패키지를 확인하세요.

File API의 기존 확장 기능은 계속 사용할 수 있으므로 즐겨 이용하는 API를 자유롭게 선택할 수 있습니다.

대소문자 구분 없이 로케일에 구애받지 않는 API

문자열과 문자의 대소문자를 변경하기 위한 다음 stdlib 함수는 많은 분들께 익숙할 것입니다: toUpperCase(), toLowerCase(), toTitleCase() 이러한 함수는 일반적으로 잘 작동하지만 처리하는 플랫폼 로케일에 따라 골치아픈 문제를 일으킬 수 있습니다. 모두 로케일에 민감하여 로케일에 따라 결과가 다를 수 있기 때문입니다. 예를 들어, ”Kotlin”.toUpperCase()로 어떤 결과가 반환될까요? 여러분은 “물론 KOTLIN이죠”라고 말할 것입니다. 그러나 터키어 로케일에서 대문자 iİ이므로 KOTLİN이라는 다른 결과가 얻어집니다.

이제 문자열과 문자의 대소문자를 변경하여 로케일의 구애를 받지 않는 새로운 API가 제공됩니다: uppercase(), lowercase(), titlecase() 확장 기능과 이에 대응하는 *Char() 이미 1.4.30의 테스트 버전에서 이 API를 사용해 보았을 수 있습니다.

새로운 함수는 플랫폼 로케일 설정에 관계없이 동일한 방식으로 작동합니다. 이들 함수를 호출하기만 하면 나머지는 stdlib이 알아서 합니다.

새로운 함수는 플랫폼 로케일 설정에 관계없이 동일한 방식으로 작동합니다. 이들 함수를 호출하기만 하면 나머지는 stdlib이 알아서 합니다.

JVM에서 현재 로케일을 인수로 사용하여 새로운 함수를 호출하면 로케일을 구분하는 대소문자 변경을 수행할 수 있습니다.

이전 함수가 새로운 함수로 완전히 대체되어 더 이상 사용되지 않습니다.

명확한 문자-코드 및 문자-숫자 변환

문자의 UTF-16 코드를 가져오는 연산인 toInt() 함수는 한 자리 문자열에서 String.toInt()와 매우 유사하여 자주 실수를 유발하고는 했습니다. 이 경우 이 숫자가 나타내는 Int가 생성되기 때문입니다.

또한 Char '4'에 대해 숫자 값 4를 반환하는 공통 함수도 없었습니다.

이러한 문제를 해결하기 위해 이제 문자와 해당 정수 코드 및 숫자 값 사이에서 변환을 수행하는 새로운 함수 세트가 제공됩니다.

  • Char(code)Char.code는 문자와 해당 코드 사이에서 변환합니다.
  • Char.digitToInt(radix: Int)와 해당 *OrNull 버전은 지정된 기수의 숫자에서 정수를 생성합니다.
  • Int.digitToChar(radix: Int)는 지정된 기수의 정수를 나타내는 숫자에서 문자를 생성합니다.

이러한 함수는 명확한 이름을 가지며 코드를 더 읽기 쉽게 만듭니다.

새로운 함수는 Kotlin 1.4.30부터 테스트 버전 모드로 사용 가능했으며 이제 안정적으로 작동합니다. 문자에서 숫자로 변환(Char.toInt() 및 다른 숫자 유형에 대한 유사한 함수) 및 숫자에서 문자로 변환(Int.toChar()를 제외한 Long.toChar() 및 유사 함수)하기 위한 이전의 함수는 이제 더 이상 사용되지 않습니다.

확장된 멀티플랫폼 Char API

표준 라이브러리의 멀티 플랫폼 부분을 계속 확장하여 멀티 플랫폼 프로젝트의 공통 코드에 이러한 기능이 이용될 수 있도록 하고 있습니다.

이제 모든 플랫폼과 공통 코드에서 사용할 수 있는 여러 Char 함수가 제공됩니다. 이러한 함수는 다음과 같습니다.

  • 문자가 글자 혹은 숫자인지 여부를 확인하는 Char.isDigit(), Char.isLetter(), Char.isLetterOrDigit()
  • 문자의 대소문자를 확인하는 Char.isLowerCase(), Char.isUpperCase(), Char.isTitleCase()
  • 문자에 Cn(undefined)이 아닌 Unicode 일반 카테고리가 있는지 여부를 확인하는 Char.isDefined()
  • 문자가 \u0000..\u001F 또는 \u007F..\u009F 범위의 코드를 가진 ISO 제어 문자인지 여부를 확인하는 Char.isISOControl()

Unicode에 따라 문자의 일반 범주를 나타내는 Char.category 프로퍼티 및 그 반환 유형 열거형 클래스인 CharCategory를 이제 멀티플랫폼 프로젝트에서 사용할 수 있습니다.

String?.toBoolean()의 엄격한 버전

Kotlin의 String?.toBoolean() 함수는 문자열로부터 부울 값을 만드는 데 널리 사용됩니다. 작동은 매우 간단합니다. 대소문자에 관계 없이 문자열 "true"에서 true이고, null을 포함한 다른 모든 문자열에서는 false입니다.

이 동작은 자연스러운 것처럼 보이지만 잠재적으로 잘못된 상황이 간과될 수 있습니다. 이 함수로 무엇을 변환하든 문자열에 예상치 못한 값이 있어도 부울이 반환됩니다.

이러한 실수를 방지하기 위해 대소문자를 구분하는 String?.toBoolean()의 새로운 엄격 한 버전이 제공됩니다.

  • String.toBooleanStrict()는 리터럴 “true” 및 “false”를 제외한 모든 입력에 대해 예외를 던집니다.
  • String.toBooleanStrictOrNull()은 리터럴 “true” 및 “false”를 제외한 모든 입력에 대해 null을 반환합니다.

Duration API 변경 사항

stdlib 버전 1.3.50부터 실험적으로 도입한 Duration and Time Measurement API를 사용할 수 있었습니다. 이를 통해 시간 간격을 정확하게 측정하기 위한 API가 제공됩니다.

이 API의 주요 클래스 중 하나는 Duration입니다. 이 클래스는 두 시점 사이의 시간을 나타냅니다. 1.5.0에서 Duration은 API와 내부 표현 모두에서 상당한 변경이 이루어졌습니다.

Duration은 이제 Double 대신 내부 표현에 Long 값을 사용합니다. Long 값의 범위를 사용하면 나노초 정밀도로 100년 이상을, 밀리초 정밀도로 1억년 이상을 나타낼 수 있습니다. 그러나 이전에 지원되었던 나노초 미만의 기간은 더 이상 사용할 수 없습니다.

또한 기간을 Long 값으로 검색하기 위한 새로운 프로퍼티도 도입될 예정입니다. 이러한 프로퍼티는 Duration.inWholeMinutes, Duration.inWholeSeconds 등 다양한 시간 단위로 사용할 수 있습니다. 이러한 함수는 Duration.inMinutes와 같은 Double 기반 프로퍼티를 대체합니다.

또 다른 변경 사항은 정수 값에서 Duration 인스턴스를 만드는 새로운 팩토리 함수 집합입니다. 이러한 함수는 Duration 유형에서 직접 정의되며 Int.seconds와 같은 숫자 유형의 이전 확장 프로퍼티를 대체합니다.

변경되는 부분이 많은 점을 감안하여 전체 기간 및 시간 측정 API는 1.5.0에서 실험적으로 유지되며 @ExperimentalTime 어노테이션으로 선택을 지정해야 합니다.

새 버전을 사용해보고 이슈 트래커 YouTrack에서 의견을 공유해주세요.

수학 연산: 내림 나누기 및 mod 연산자

Kotlin에서 정수에 대한 나누기 연산자(/)는 나눗셈 결과의 소수 부분을 제거하는 버림 나눗셈을 수행합니다. 모듈식 산술에는 결과를 반내림하여(더 작은 정수로) 음수에 대해 다른 결과를 생성하는 대안인 내림 나눗셈도 있습니다.

이전에는 내림 나눗셈에 다음과 같은 사용자 지정 함수가 필요했습니다.

1.5.0-RC에서는 정수에 대해 내림 나누기를 수행하는 floorDiv() 함수를 제공합니다.

1.5.0에서는 새로운 mod() 함수를 도입했습니다. 이제 이 함수가 이름에서 알 수 있듯이 내림 나누기의 나머지 부분인 나머지를 반환합니다.

이것은 Kotlin의 rem()(또는 % 연산자)와는 다릅니다. 나머지는 aa.floorDiv(b) * b 사이의 차이입니다. 0이 아닌 계수는 항상 b와 같은 부호를 가지며 a % b는 다른 부호를 가질 수 있습니다. 이러한 부분은 예를 들어 순환 목록을 구현할 때 유용할 수 있습니다.

컬렉션: firstNotNullOf() 및 firstNotNullOfOrNull()

Kotlin 컬렉션 API는 기본 제공되는 함수를 이용해 컬렉션에서 널리 사용되는 다양한 작업을 처리합니다. 일반적이지 않은 경우에는 보통 이러한 함수 호출을 결합합니다. 작동은 하지만 항상 가볍게 처리되지는 않으며 오버헤드가 발생할 수 있습니다.

예를 들어, 컬렉션 요소에서 선택자 함수의 첫 번째 null이 아닌 결과를 가져오려면 mapNotNull()first()를 호출할 수 있습니다. 1.5.0에서는 새 함수 firstNotNullOf()의 단일 호출로 이를 수행할 수 있습니다. firstNotNullOf()와 함께, 반환할 값이 없는 경우 null을 생성하는 *orNull() 대응 함수도 추가됩니다.

다음 예는 이를 통해 코드를 어떻게 단축할 수 있는지를 보여줍니다.

nullable 프로퍼티를 가진 클래스가 있고 클래스 인스턴스 목록에서 null이 아닌 첫 번째 값이 필요하다고 가정하겠습니다.

컬렉션을 반복하고 프로퍼티가 null이 아닌지 확인하여 이를 구현할 수 있습니다.

또 다른 방법은 기존의 mapNotNull()firstOrNull() 함수를 사용하는 것입니다. mapNotNull()은 특히 큰 컬렉션의 경우에 추가 메모리가 필요한 중간 컬렉션을 빌드합니다. 그래서 여기에서 시퀀스로의 변환이 필요할 수도 있습니다.

새로운 함수에서는 다음과 같습니다.

테스트 라이브러리 변경

여러 릴리스가 나오는 동안 Kotlin 테스트 라이브러리인 kotlin-test에 별다른 업데이트가 없었지만 이번에는 오랫동안 기다려온 변경 사항이 적용되었습니다. 1.5.0-RC에서는 여러 가지 새로운 기능을 시도해볼 수 있습니다.

  • 멀티플랫폼 프로젝트의 단일 kotlin-test 종속성.
  • Kotlin/JVM 소스 세트에 대한 테스트 프레임워크의 자동 선택.
  • 어설션 함수 업데이트.

멀티플랫폼 프로젝트의 kotlin-test 종속성

멀티플랫폼 프로젝트를 위한 구성 프로세스를 계속해서 개발하고 있습니다. 1.5.0에서는 모든 소스 세트에 대해 kotlin-test에 대한 종속성을 더 쉽게 설정할 수 있도록 했습니다.

이제 공통 테스트 소스 세트의 kotlin-test 종속성만 추가하면 됩니다. Gradle 플러그인이 다른 소스 세트에 대한 해당 플랫폼 종속성을 추론합니다.

  • JVM 소스 세트용 kotlin-test-junit. 명시적으로 활성화하는 경우 kotlin-test-junit-5 또는 kotlin-test-testng로 전환할 수도 있습니다. 이어지는 내용에서 방법을 알아보세요.
  • Kotlin/JS 소스 세트용 kotlin-test-js
  • 공통 소스 세트용 kotlin-test-commonkotlin-test-annotations-common.
  • Kotlin/Native는 kotlin-test API의 기본 구현을 제공하므로 Kotlin/Native 소스 세트에 대한 추가 아티팩트가 없습니다.

Kotlin/JVM 소스 세트에 대한 테스트 프레임워크의 자동 선택

위에서 설명한 대로 공통 테스트 소스 세트에서 kotlin-test 종속성을 지정하면 JVM 소스 세트가 JUnit 4에 대한 종속성을 자동으로 수신합니다. 이게 끝입니다. 즉시 테스트를 작성하고 실행할 수 있습니다!

Groovy DSL에서는 다음과 같이 나타납니다.

그리고 Kotlin DSL에서는 다음과 같습니다.

테스트 작업에서 간단히 함수를 호출하여 JUnit 5 또는 TestNG로 전환할 수도 있습니다: useJUnitPlatform() 또는 useTestNG().

kotlin-test 종속성을 추가하면 JVM 전용 프로젝트에서도 동일하게 작동합니다.

어설션 함수 업데이트

1.5.0에서는 기존 어설션 함수를 개선하는 동시에 새로운 어설션 함수도 다수 준비했습니다.

먼저, 새로운 함수를 간단히 살펴 보겠습니다.

  • assertIs<T>()assertIsNot<T>()는 값의 유형을 확인합니다.
  • assertContentEquals()는 배열, 시퀀스 및 모든 Iterable에 대한 컨테이너 내용을 비교합니다. 보다 정확하게는 예상실제가 동일한 순서로 동일한 요소를 포함하는지 확인합니다.
  • DoubleFloat에 대한 assertEquals()assertNotEquals()에는 세 번째 매개변수인 정밀도가 포함된 새로운 오버로드가 있습니다.
  • assertContains()는 배열, 목록, 범위 등 contains() 연산자가 정의된 모든 객체에서 항목의 존재 유무를 확인합니다.

다음은 이러한 함수의 사용법을 보여주는 간단한 예입니다.

기존 어설션 함수와 관련하여 이제 assertTrue(), assertFalse()expect()로 전달된 람다 표현식 내에서 일시 중지 함수를 호출할 수 있습니다. 이러한 함수는 이제 인라인 화되었기 때문입니다.

Kotlin 1.5.0의 모든 기능을 사용해 보세요.

1.5.0-RC를 사용하여 이러한 모든 최신 Kotlin API를 실제 프로젝트에 적용해 보세요!

IntelliJ IDEA 또는 Android Studio에서 Kotlin 플러그인 1.5.0-RC를 설치하세요. EAP 플러그인 버전을 사용하는 방법에 대해서도 알아보세요.

1.5.0-RC로 기존 프로젝트를 빌드하여 1.5.0에서 어떻게 작동하는지 확인해 보세요. 테스트 버전 릴리스를 위해 단순화된 새로운 구성을 사용하면 Kotlin 버전을 1.5.0-RC로 변경하고 필요한 경우 종속성 버전을 조정하기만 하면 됩니다.

1.5.0-RC 설치

언제나 그렇듯이 Kotlin Playground에서 온라인으로 최신 버전을 사용해 볼 수 있습니다.

호환성

모든 기능 릴리스와 마찬가지로, 이전에 공개했던 변경 사항의 일부 지원 중단 주기가 Kotlin 1.5.0에서 종료됩니다. 이러한 사례는 언어 위원회에서 모두 신중하게 검토한 후 Kotlin 1.5 호환성 가이드에 표시됩니다. 또한 해당 변경 사항을 YouTrack에서 확인할 수도 있습니다.

릴리스 후보 안내

Kotlin 1.5.0의 릴리스 후보가 결정되었으며 이제 여러분이 컴파일하고 게시할 차례입니다! 기존 주요 릴리스와는 달리 Kotlin 1.5.0-RC에서 생성된 바이너리는 Kotlin 1.5.0과 호환성이 보장됩니다.

의견을 공유해 주세요

이번이 다음 기능 릴리스에 영향을 미칠 수 있는 마지막 기회입니다! 발견한 문제가 있으면 이슈 트래커에서 공유해 주세요. 여러분과 커뮤니티를 위해 Kotlin 1.5.0 개선에 동참해 주세요!

1.5.0-RC 설치


이 게시물은 Pavel Semyonov가 작성한 Kotlin 1.5.0-RC Released: Changes to the Standard and Test Libraries를 번역한 글입니다.

Discover more