2015년 12월 22일
Kotlin Beta 4를 발표하게 되어 기쁩니다. 이것은 1.0으로 가는 또 다른 단계입니다! 우리는 이제 기반 인프라와 미래 지향적인 변경에 주력하고 있습니다. 변경 사항의 전체 목록은 여기에서 확인할 수 있습니다. 자세한 내용은 아래에 제공됩니다.
또한 1.0 이전에 우리가 무엇을 할 계획인지 알려드릴 시간입니다.
증분 컴파일 개선 (실험 중)
우리는 Kotlin의 증분 컴파일을 훨씬 더 빠르게 만들어주는 새로운 정확한 의존성 검출 알고리즘을 도입했습니다. 아직 실험적인 단계이지만 이미 우리의 사용 사례에 대해 잘 작동하고 있습니다. 시도해보려면 다음을 실행하십시오:
설정 | 빌드, 실행, 배포 | 컴파일러 | Kotlin 컴파일러 | 정밀한 증분 컴파일 사용 (실험적)
곧: 동일한 증분 컴파일 지원이 Gradle로 확장됩니다! 기대해주세요.
언어
전체 변경 목록 중 일부 하이라이트입니다.
중복 해결 변경 사항
오버로드 해결 알고리즘의 수정으로 인해 Kotlin은 이제 SAM으로 변환된 Java 함수를 멤버와 더 유사하게 처리합니다(이전에는 확장과 같은 방식으로 동작했습니다). 이 수정은 중요하며 그렇지 않으면 컴파일러가 많은 경우를 복잡한 방식으로 해석하게 됩니다.
불행하게도 이 결과로 손상된 비교적 일반적인 경우가 적어도 하나는 있습니다. 그러나 수정은 매우 간단합니다. 이제 컴파일러는 file.listFiles { it.name == "..." }에 대해 에러를 발생시킵니다.
그 이유는 꽤 복잡합니다:
- java.io.File에는 세 가지 오버로드된 listFiles가 있습니다.
- 두 개는 SAM 인터페이스를 받으며 람다를 받을 수 있도록 변환합니다.
- 따라서 매개변수 없는 람다가 전달되면 어떤 것을 선택해야 할지 알 수 없습니다.
- 이전에는 예전 라이브러리 확장 함수(이전의 SAM 시대로 거슬러 올라가는 것)가 SAM으로 변환된 멤버 대신 선택되었습니다.
해결책은 간단하며, 매개변수를 지정하기만 하면 됩니다. 예를 들어:
file.listFiles { it -> ... }
매개변수 없는 함수 객체로 속성 사용 가능
예시: Kotlin에서 String::length는 함수가 아닌 속성입니다. 그러나 함수가 필요한 위치에서 사용할 수 있는 것이 편리합니다.
val lengths = strs.map(String::length)
그래서 우리는 이제 이것을 허용합니다. 다시 말해, 어떤 API가 (R) -> T 유형의 함수를 예상할 때 R의 속성 참조를 사용하여 T를 반환하는 경우를 사용할 수 있습니다.
미래에 사용할 키워드 예약
우리는 미래의 Kotlin 릴리스에서 새로운 기능을 추가할 계획이므로 필요한 키워드를 미리 예약하기로 결정했습니다. 미래를 모두 예측할 수는 없지만 다음은 우리의 최선의 추측입니다(미래 기능에 대한 자세한 설계는 아직 제공되지 않았지만 가능한 유용하게 만들기 위해 최선을 다하겠습니다):
- yield는 키워드로 예약되었습니다.
- sealed는 "when" 앞에 예약되었습니다.
- typeof는 키워드로 예약되었습니다. JS에서는 jsTypeOf()를 사용합니다.
- async는 "{"와 "fun" 앞에 예약되었습니다.
따라서 이제 async {...} 대신 async () {...}라고 말해야 합니다. 코드 완성은 ()를 자동으로 삽입합니다.
코드 정리는 기존 코드를 마이그레이션하는 데 도움을 줄 것입니다.
Java 와일드카드
Kotlin이 변이 유형을 어떻게 변환하는지에 문제가 있었습니다. 예를 들어 List<Foo>가 Java에서 List<? extends Foo>로 변환되어야 할지 단순히 List<Foo>로 변환되어야 할지에 대한 문제가 있습니다. 세부 사항과 더불어, 우리는 다음과 같이 수행했습니다:
- 기본적으로 반환 유형에서는 의미 없는 경우 와일드카드를 생성하지 않습니다.
- 와일드카드가 필요한 경우 유형 주석을 사용하여 강제로 추가할 수 있습니다: List<@JvmWildcard String>은 항상 Java에서 List<? extends String>입니다.
- 와일드카드를 제거해야 할 경우 @JvmSuppressWildcards를 사용할 수 있습니다(이것은 유형 또는 해당 유형을 포함하는 선언에서 사용할 수 있음).
예제:
fun foo(l: List<String>) // in Java: List<String> (String is final)
fun foo(l: List<@JvmWildcard String>) // in Java: List<? extends String>
interface Open
fun bar(p: List<Open>) // in Java: List<? extends Open> (Open is not final)
@JvmSuppressWildcards
fun bar(p: List<Open>) // in Java: List<Open>
참고: 이것은 컬렉션뿐만 아니라 모든 선언 사이트 변동성 유형에 해당합니다.
라이브러리 변경
우리는 표준 라이브러리를 정리하고 이에 포함된 몇 가지 패키징을 변경하고 있습니다:
- kotlin.test 패키지가 별도의 jar 파일인 kotlin-test.jar로 이동되었습니다. IDE에서 이 종속성을 자동으로 추가하는 빠른 해결책이 제공됩니다.
- 표준 라이브러리의 패키지를 재배치하기 위해 준비 단계에서 새로운 패키지를 만들고 모든 함수를 복사했습니다. 이전 함수는 이진 호환성을 위해 유지됩니다. Kotlin 코드에 대한 마이그레이션이 필요하지 않으며, Java 코드에 대한 코드 정리가 가능합니다.
나중에 우리는 라이브러리에서 하나의 JAR 더 추출할 계획입니다. 이 JAR에는 자주 사용되지 않는 배열 유틸리티가 포함될 예정이며, 주요 JAR 외부에 유지하여 크기를 줄이려고 합니다.
추가 하이라이트 몇 가지:
Kotlin의 Int::class는 Java의 int.class 또는 Integer.class에 서로 다른 맥락에서 해당될 수 있습니다(정당화되었습니다). 특정 둘 중 하나가 필요한 사용 사례를 용이하게 하기 위해 다음 두 가지 속성을 도입했습니다:
- Int::class.javaPrimitiveType은 Int.class를 반환합니다.
- Int::class.javaObjectType은 Integer.class를 반환합니다.
또한 IntArray(5) { it * 3 }와 같은 것을 할 수 있습니다. 즉, 초기화된 기본 배열을 생성할 수 있습니다.
미래 변경 사항: 컬렉션에서의 null 의미
JDK의 나중 버전에서는 컬렉션에서 점점 더 null을 허용하지 않게 되고 있습니다. 예를 들어, java.util.Map.computeIfAbsent에 대한 JavaDoc에는 다음과 같이 언급됩니다:
지정된 키가 이미 값과 연결되지 않았거나 null로 매핑된 경우 지정된 매핑 함수를 사용하여 그 값을 계산하고 이 값을 이 맵에 입력합니다.
이러한 계약은 이러한 작업의 원자성 속성에 내재되어 있으므로, 우리는 이러한 계약을 준수하지 않으면 Kotlin의 확장 함수가 null-free 동시 컬렉션에서 작동할 때 올바른 동작을 보장할 수 없게 될 것입니다. 그래서 getOrPut 및 이와 유사한 함수의 동작을 변경하여 null 값을 값이 존재하지 않았던 것처럼 처리할 예정입니다.
코드를 업데이트하려면 폐기 경고에서 제공하는 권장 사항을 따르십시오.
IDE의 새로운 기능
- 미해결 참조 이름을 바꿀 수 있는 빠른 해결책이 추가되었습니다. 다른 문맥에 코드를 붙여 넣을 때 심볼 이름을 조정하는 데 유용합니다:
- 이제 IDE에서 미해결 가능한 호출 가능한 참조로부터 함수를 생성할 수 있습니다:
- 이제 최상위 함수에 대한 테스트로 이동 및 테스트 생성 작업이 작동합니다:
- 익명 함수를 람다 표현식으로 변환하는 의도가 추가되었습니다.
- 클래스로 이동 및 어디서든 검색 기능이 이제 Kotlin 내장 유형을 표시합니다.
- 디버거에서 '간단한 getter 건너뛰기' 옵션이 지원됩니다. 이는 디버거가 생성자에서 정의된 속성, getter가 없는 속성 또는 일부 필드의 값을 반환하는 getter에서 중지하지 않게 합니다.
다음은 무엇인가요
베타 기간이 끝나면 RC가 출시되고 그 후에 1.0이 출시될 예정입니다.
1.0 이전 릴리스 버전으로 컴파일된 코드는 1.0 이후에 남아 있지 않도록 하고 싶습니다. 따라서 RC 컴파일러는 이전 코드의 모든 재컴파일을 강제할 것입니다. 우리는 JetBrains 외부의 라이브러리 유지 관리자와 협력하여 널리 사용되는 라이브러리가 제시간에 재컴파일되도록 조정할 것입니다.
우리는 또한 이 시점에서 일부 유산을 제거하는 기회를 가질 예정입니다:
- 라이브러리 진화 과정에서 누적된 모든 폐기 경고를 제거합니다.
- 생성된 코드에서 모든 폐기 경고를 제거합니다(이것에 대해 들어본 적이 없을 수 있지만 존재합니다!).
- 베타 기간 동안 발견된 일부 레거시 바이트 코드 특성을 제거합니다.
- 표준 라이브러리의 일부 코드를 이동하여 해당 패키지가 더 많은 구조를 가지도록 할 계획입니다.
이 시점 이후에 표준 라이브러리의 호환 가능한 변경 사항은 폐기 경고와 추가 사항만 포함됩니다(이는 리플렉션 API를 포함하지 않습니다). 우리는 라이브러리 API에 대한 오픈 리뷰를 진행하여 중요한 부분을 빠뜨리지 않도록 하겠습니다.
즐거운 Kotlin 사용하세요! :)
원문
https://blog.jetbrains.com/kotlin/2015/12/kotlin-1-0-beta-4-is-out/
'Kotlin > Release Notes' 카테고리의 다른 글
[Kotlin Release Notes] Kotlin 1.0 Released: Pragmatic Language for the JVM and Android (0) | 2023.09.02 |
---|---|
[Kotlin Release Notes] Kotlin 1.0 Release Candidate is Out! (1) | 2023.09.02 |
[Kotlin Release Notes] Kotlin 1.0 Beta 3 is Out! (0) | 2023.08.29 |
[Kotlin Release Notes] Kotlin 1.0 Beta 2 is Out! (0) | 2023.08.29 |
[Kotlin Release Notes] The Kotlin Language: 1.0 Beta is Here! (0) | 2023.08.29 |
댓글