본문 바로가기
Kotlin/Release Notes

[Kotlin Release Notes] Kotlin 1.2 Beta Is Out

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

2017년 9월 29일

 

우리는 Kotlin 1.2 베타 릴리스를 발표하게 되어 기쁩니다. 이번 릴리스에서는 Kotlin 1.2의 주요 새로운 기능인 실험적인 멀티플랫폼 프로젝트 지원을 소개합니다. 또한, 언어와 표준 라이브러리는 이제 기능이 완료되었습니다. Kotlin 1.2의 모든 새로운 기능이 구현되었습니다. 이제 변경 사항에 대한 피드백을 주실 때입니다. 피드백을 고려하여 디자인을 조정하여 최종 1.2 릴리스를 준비할 시간이 남아 있습니다.

도구 관련해서는 Kotlin 1.2 베타는 최근에 릴리스된 1.1.50 업데이트와 동일한 기능 세트를 포함하고 있습니다. 베타 버전은 2016.3부터 2017.3까지의 모든 IntelliJ IDEA 버전과 Android Studio 2.3 및 3.0과 호환됩니다.

1.2 베타 버전에 대한 완전한 변경 로그는 여기에서 확인하실 수 있습니다. 주요 변경 사항은 아래에 나와 있습니다.

 

 

멀티플랫폼 프로젝트


멀티플랫폼 프로젝트는 Kotlin 1.2의 새로운 실험적인 기능으로, Kotlin이 지원하는 대상 플랫폼인 JVM, JavaScript 및 (미래에는) Native 간에 코드를 재사용할 수 있게 해줍니다. 멀티플랫폼 프로젝트에서는 대상 플랫폼 간에 공유되는 코드를 공통 모듈에 넣고, 플랫폼에 따라 다른 부분은 해당 플랫폼용 모듈에 넣습니다. 이렇게 프로젝트를 특정 플랫폼으로 컴파일하면 공통 및 플랫폼별 부분의 코드가 모두 생성됩니다.

멀티플랫폼 프로젝트 지원의 주요 기능은 공통 코드에서 플랫폼별 부분에 대한 의존성을 기대 및 실제 선언을 통해 표현할 수 있는 기능입니다. 기대 선언은 API(클래스, 인터페이스, 주석, 최상위 선언 등)를 지정합니다. 실제 선언은 플랫폼별로 다른 구현이거나 외부 라이브러리의 API 구현을 참조하는 typealias입니다:

// Common code
expect fun hello(world: String)

expect class URL(spec: String) {
  open fun getHost(): String
  open fun getPath(): String
}

// JVM code
actual fun hello(world: String) {
  println("Hello JVM $world")
}

actual typealias URL = java.net.URL


멀티플랫폼 프로젝트에 대한 자세한 정보는 문서를 확인해주세요.

이 기능을 발표하기 전에 시도해보신 경우, 헤더와 impl 키워드가 expect 및 actual로 변경되었음을 알려드립니다. 코드를 자동으로 업데이트하려면 IntelliJ IDEA에서 Analyze | Cleanup Code…를 사용하세요.


언어 및 컴파일러


어노테이션에서의 배열 리터럴


Kotlin 1.2의 새로운 언어 기능은 어노테이션에서의 배열 리터럴 지원입니다. 이제 @CacheConfig(cacheNames = arrayOf("books", "default"))와 같이 작성하는 대신에 간단하게 리터럴 표현을 사용할 수 있습니다:

 

@CacheConfig(cacheNames = ["books", "default"])


이 기능은 이전 마일스톤 릴리스에서 이미 사용 가능했습니다. 1.2 베타에서는 구문을 더 일관성 있게 만들고, 배열 및 가변 인자 매개변수 모두에 대해 배열 리터럴을 사용할 수 있게 했습니다:

 

@RequestMapping(value = ["value1", "value2"], path = ["path1", "path2"])


이 변경을 가능하게 하기 위해 일반 메서드 호출 및 어노테이션에서 명명된 인자와 가변 인자를 함께 사용하는 구문에 일부 조정 사항을 추가했습니다. 아마 놀라실 것입니다만, Kotlin 1.1에서 명명된 인자 구문을 사용하여 가변 인자 메서드를 호출할 때 단일 인자를 즉시 값으로 전달하는 것이 가능했습니다:

 

fun foo(vararg strs: String) { ... }

foo(strs = "abc")


strs가 하나의 문자열 "abc"임을 나타내는 것은 다소 직관적이지 않으며, 또한 전체 배열을 명명된 인자로 전달할 때는 전개 연산자를 사용해야 했습니다:

foo(strs = *arr)


우리는 foo(strs = "abc")를 foo(strs = arr)로 만들고 싶었지만 호환성을 위해 점진적인 마이그레이션이 필요하여 1.2에서 foo(strs = "abc")를 폐기하고 대신 전개 연산자와 arrayOf 메서드를 사용하도록 결정했습니다:

 

foo(x = *arrayOf("abc"))

 

우리는 이러한 호출에서 배열 할당 및 복사를 생략하는 컴파일러 최적화를 구현할 계획입니다.


어노테이션은 더 제약이 있는 맥락에서는 하나의 단계를 건너뛸 수 있습니다. 따라서 spread 연산자 없이 배열 리터럴에 값을 감싸면 됩니다:

 

annotation class Foo(vararg value: String)

@Foo(value = "a") // deprecated
@Foo(value = ["a"]) // correct


더 자세한 정보는 YouTrack 이슈를 참조하십시오.


lateinit 개선사항


우리는 지연 초기화 변수가 초기화되었는지 확인할 수 있는 새로운 리플렉션 API를 추가했습니다:

 

lateinit var file: File

// ...

if (::file.isInitialized) {
  ...
}


이것은 이 KEEP 제안의 부분 구현입니다. 남은 부분(해제 초기화 메서드)은 1.3까지 잠정적으로 연기되었습니다.

또한 lateinit 한정자는 이제 최상위 프로퍼티와 로컬 변수에 사용할 수 있습니다. 후자는 객체 그래프를 초기화하고 그래프 내 객체의 프로퍼티 간에 순환 의존성이 있는 경우에 사용할 수 있습니다(예: 람다가 다른 객체를 참조하며 이 객체는 나중에 정의되어야 함):

 

fun test() {
  lateinit var x: Component

  // inject takes a lambda which must return the Component though
  val injector = inject(
    ...,
    componentProvider = { x },
    ...
  )

  // Initialization is only possible via injector, once it has been run
  x = injector.createComponent()
}

 

더 자세한 정보는 KEEP을 참조하십시오.


바운드 호출 가능 참조 개선사항


이제 이::foo와 같은 표현에서 this를 생략할 수 있습니다. 이렇게 하면 이 멤버에 바인드된 호출 가능 참조를 생성할 수 있습니다. 이전에 빈 왼쪽 측 구문은 최상위 선언에 대한 호출 가능 참조를 생성하는 데만 사용할 수 있었습니다. 자세한 내용은 이 YouTrack 이슈를 참조하십시오.


타입 추론 개선사항


Kotlin 컴파일러는 이제 타입 캐스트의 정보를 타입 추론에 사용할 수 있습니다. 제네릭 메서드를 호출하고 반환 값을 특정 타입 Foo로 캐스팅하는 경우, 컴파일러는 이 호출에 대한 T가 타입 Foo에 바인딩되어야 함을 이해합니다. 안드로이드 개발자에게 특히 중요한 이 기능은 안드로이드 API 레벨 26에서 findViewById 호출을 올바르게 분석할 수 있게 해줍니다:

val button = findViewById(R.id.button) as Button


메서드가 <T extends View> T findViewById(int id)로 변경되었기 때문에 Kotlin 1.1에서는 이러한 호출에 대한 T의 타입 인자를 추론하지 못했습니다. 자세한 내용은 YouTrack 이슈를 참조하십시오.


경고를 오류로 취급


컴파일러는 이제 모든 경고를 오류로 취급하는 옵션을 제공합니다. 명령 줄에서 -Werror을 사용하거나 다음 Gradle 코드 조각을 사용하십시오:

 

compileKotlin {
  kotlinOptions.warningsAsErrors = true
}


스마트 캐스트 개선사항


스마트 캐스트는 이제 안전한 캐스트의 주제에 적용됩니다:

fun foo(x: Foo?) {
  val b = (x as? SubClass)?.subclassMethod1()
  if (b != null) {
    x.subclassMethod2() // x is smart cast to SubClass
  }
}


또한 람다 내에서 var 변수에 대한 스마트 캐스트가 이제 var 변수가 람다 이전에만 수정되는 경우에 허용됩니다:

 

var x: String? = null
if (flag) x = "Yahoo!"

run {
  if (x != null) {
    println(x.length) // x is smart cast to String
  }
}


열거형 항목 내의 중첩 클래스


열거형 항목 내의 중첩 클래스는 이제 사용되지 않습니다. 수정하려면 클래스를 inner로 표시하십시오.


표준 라이브러리


패키지 분할 호환성


Kotlin 표준 라이브러리는 이제 Java 9 모듈 시스템과 완벽하게 호환됩니다. 이는 분할된 패키지(동일한 패키지에 클래스를 선언하는 여러 JAR 파일)를 금지하는 Java 9 모듈 시스템을 지원하기 위한 것입니다. 이를 지원하기 위해 이전 kotlin-stdlib-jre7 및 kotlin-stdlib-jre8을 대체하는 새로운 아티팩트인 kotlin-stdlib-jdk7 및 kotlin-stdlib-jdk8을 만들었습니다. 새 아티팩트의 선언은 Kotlin 관점에서 동일한 패키지 이름으로 보이지만, 우리가 추가한 특별한 컴파일러 마법 덕분에 Java 관점에서는 다른 패키지 이름으로 보입니다. 따라서 새 아티팩트로 전환하려면 소스 코드에 변경 사항이 필요하지 않습니다.

우리는 새로운 모듈 시스템과 호환성을 보장하기 위해 더 많은 변경 사항을 적용했습니다. kotlin-reflect 라이브러리의 kotlin.reflect 패키지에서 더 이상 사용되지 않는 선언을 제거했습니다. 이를 사용하고 있다면 Kotlin 1.1부터 지원되는 kotlin.reflect.full 패키지의 선언을 사용하도록 전환해야 합니다.


kotlin.math


kotlin.math는 Kotlin 1.2 표준 라이브러리의 새로운 패키지로, 플랫폼 간 코드에서 수학 연산을 수행할 수 있게 해줍니다. 1.2 베타에서 우리는 이에 대한 여러 개선사항을 도입했습니다:

역쌍곡 함수(asinh, acosh, atanh)가 지원됩니다.
1.2-M2에 추가된 부동 소수점 숫자의 이진 표현과 관련된 함수(toBits, nextUp 등)가 JavaScript에서도 사용 가능합니다.
JavaScript용 math 폴리필의 정밀도가 향상되었습니다.


미리 릴리스 노트


다른 마일스톤 릴리스와 마찬가지로 1.2의 새로운 언어 및 라이브러리 기능에 대한 역호환성 보장은 없습니다. 1.2의 마일스톤 릴리스에서 소개된 모든 내용은 최종 1.2 릴리스 이전에 변경될 수 있습니다. 최종 RC에 도달하면 프리릴리스 버전으로 컴파일된 모든 이진 파일은 컴파일러에 의해 금지될 것입니다: 1.2‑Mx 또는 1.2-Beta로 컴파일된 모든 것을 다시 컴파일해야 합니다.
그러나 1.1.x 및 이전 릴리스로 컴파일된 모든 코드는 별다른 재컴파일 없이 완벽하게 작동합니다.


시험해보는 방법


Maven/Gradle에서: 빌드 스크립트 및 프로젝트에 http://dl.bintray.com/kotlin/kotlin-eap-1.2를 저장소로 추가하고, 컴파일러 플러그인 및 표준 라이브러리 버전 번호로 1.2.0-beta-31을 사용하십시오.

IntelliJ IDEA에서: 도구 → Kotlin → Kotlin 플러그인 업데이트 구성으로 이동한 다음 업데이트 채널 드롭다운 목록에서 "Early Access Preview 1.2"를 선택한 후 업데이트를 확인하십시오.
커맨드라인 컴파일러는 GitHub 릴리스 페이지에서 다운로드할 수 있습니다.

try.kotlinlang.org에서: 오른쪽 하단의 드롭다운 목록을 사용하여 컴파일러 버전을 1.2‑Beta로 변경할 수 있습니다(곧 제공될 예정).

 

원문

 

https://blog.jetbrains.com/kotlin/2017/09/kotlin-1-2-beta-is-out/

반응형

댓글