2012년 12월 11일
오늘 우리는 Kotlin M4를 출시합니다(눈 속에서). 이 포스트는 이 마일스톤이 가져올 새로운 기능과 다른 것들에 대한 개요를 제공합니다.
이런저런 개선사항
Kotlin M4는 JDK7에 친화적입니다: 우리는 여전히 Java6과 호환되는 바이트 코드를 생성하지만, JDK7에 대한 컴파일과 관련된 몇 가지 문제가 해결되었습니다.
타입 인자 추론이 더욱 개선되었으며, 이제 더 빠르고 앞으로 더 많은 속도 향상이 예정되어 있습니다.
코드 완성도 여러 면에서 개선되었습니다. 즐기세요 :)
전반적으로 M3.1이 출시된 이후 128개의 문제가 해결되었습니다.
KAnnotator: 세상을 주석으로 달다
M3부터 외부 주석을 사용하여 메서드가 널이 아닌 값을 반환하거나 취하는 것을 시스템에 알릴 수 있습니다. 이 메커니즘은 Kotlin을 사용하지 않더라도 유용합니다: Java에서도 널 가능성 검사를 켤 수 있습니다(그리고 저는 완전히 추천합니다).
이에 대한 하나의 문제점은, JetBrains에서처럼 코드를 작성하면서 자신의 코드에 주석을 달 수 있지만, 좋아하는 라이브러리는 주석이 달려있지 않고, 수동으로 주석을 달기에는 너무 크다는 것입니다.
핵심은 '수동'입니다. 프로그래머는 게으른 생물이며, 게으름으로 인해 가능한 한 많은 것을 자동화하려고 합니다. 그래서 오늘 Kotlin M4와 함께 KAnnotator를 출시합니다: 이는 라이브러리에 자동으로 주석을 달아주는 도구입니다(물론 Kotlin으로 작성되었습니다).
간단히 말해서 작동 원리는 다음과 같습니다: 라이브러리를 jar(또는 여러 jar)로 갖고 있고, KAnnotator에게 이러한 jar에 대한 주석을 유추하도록 지시합니다. 그런 다음 .xml 파일들을 받습니다. 이 파일들에는 메서드와 필드에 대한 주석이 포함되어 있습니다.
이제 이러한 주석을 프로젝트에 첨부할 수 있고, Java IDE와 Kotlin 컴파일러 모두 이를 볼 수 있습니다.
KAnnotator는 막 시작했지만, 이미 전체 JDK에 대한 주석이 있으며, 새 Kotlin 플러그인에서 사용할 수 있습니다. Kotlin 파일을 에디터에서 열면 JDK에 추가할 것을 제안할 것입니다.
데이터 복사
Kotlin M3에서는 데이터 클래스를 도입하여 데이터를 표현하는 좋은 방법을 제공했습니다. 인기 있는 요청 중 하나는 데이터 클래스의 인스턴스를 복사하고 일부 속성만 선택적으로 변경하면서 객체를 불변으로 유지할 수 있는 기능이었습니다.
Kotlin M4에서 이렇게 할 수 있습니다:
data class Person(val firstName: String, val lastName: String)
fun Person.asMarried(newLastName: String)
= this.copy(lastName = newLastName)
모든 데이터 클래스는 모든 매개변수에 대한 기본값이 있는 copy() 함수를 얻습니다. 따라서 변경하려는 것만 지정하면 됩니다. Kotlin은 명명된 인수를 지원하므로 'copy(property1 = v1, property3 = v2)'라고만 하면 나머지 속성은 복사되고 'property1'과 'property3'만 변경됩니다.
자바에서의 선언 위치에서의 변이성
이에 대한 별도의 게시물이 나올 예정이지만, 여기에 간단한 공지를 하겠습니다. Java에서는 그 목록을 수정하려고 하지 않을 때마다 'List<? extends Foo>'라고 작성해야 한다는 것을 모두 알고 있습니다. 알다시피, Kotlin은 사이트에서의 선언 변이와 읽기 전용 인터페이스를 가지고 있어 'List<String>'이 'List<Object>'가 예상되는 곳에 올 수 있습니다.
이제 Kotlin에서 이런 함수가 있다고 해봅시다:
fun join(l: List<Any>, separator: String): String = ...
여기에 어떤 리스트든 넘길 수 있지만, Java에서 이를 호출하려면 어떻게 해야 할까요?
M4에서는 Kotlin이 이 함수에 대한 다음과 같은 Java 시그니처를 생성합니다:
String join(List<? extends Object>, String separator)
이로 인해 Java 코드에서도 문자열 리스트를 전달할 수 있게 됩니다.
와일드카드를 절대로 제대로 사용할 수 없었다면, 이제 답이 있습니다: 그냥 Kotlin을 작성하고 Java에서 호출하면 됩니다 :)
폐기 예정 지원
어떤 설계 결정은 좋고 어떤 것은 그렇지 않습니다. 어떤 것은 처음에는 좋았지만 이제는 그렇지 않을 수 있습니다. 그래서 우리는 것들을 폐기할 수 있어야 합니다. Kotlin M4는 Java의 @Deprecated와 달리, 이 대신 사용해야 할 것이 무엇인지를 알려주는 문자열 매개변수가 필요한 'deprecated' 주석을 지원합니다.
예를 들어, 이 마일스톤에서는 표준 라이브러리의 arrayList(...), hashSet(...) 등과 같은 함수들이 혼란을 줄 수 있다고 판단하여 폐기했습니다:
val c: List<Node> = node.getChildren()
ArrayList(c) // 그 리스트의 복사본
arrayList(c) // 그 리스트를 포함하는 리스트, [c]
한 글자의 차이가 의미를 크게 변화시킵니다. 그래서 이제 arrayList()는 더 이상 사용되지 않고, 새로운 arrayListOf()가 사용 가능합니다. 또한 새로운 list() 함수도 있어서 이것도 어레이 리스트를 생성하지만 읽기 전용 참조로 반환합니다. 따라서 이제 arrayList()의 선언은 다음과 같이 보입니다:
그리고 만약 어딘가에서 이를 사용하고 있다면, 호출 위치에서 무언가 문제가 있다고 알려주고 무엇을 해야 하는지 알려줄 것입니다:
IDE 개선 사항
디렉토리 내 모든 테스트 실행. 이제 IntelliJ IDEA는 Kotlin으로 작성된 테스트를 찾을 수 있으므로 디렉토리/패키지 내의 모든 테스트를 실행할 수 있습니다: Java 테스트뿐만 아니라 Kotlin 테스트도 마찬가지입니다.
디버거. 확장 함수/속성의 수신자가 이제 변수 뷰에서 볼 수 있도록 여러가지 수정이 이루어졌습니다.
새로운 Make 절차. IntelliJ IDEA 12는 새로운 make의 구현을 도입했습니다. Kotlin M4는 이에 대한 지원을 추가하며, 이 지원은 결국 Kotlin의 증분 컴파일러로 발전할 것입니다.
Kotlin 홈페이지는 이제 문서, 포럼, 트래커, 소스 코드 등을 종합하는 통합 검색 상자를 제공합니다.
일시적으로 하루에 100번의 검색으로 제한되어 있지만, 이 제한은 곧 해제될 예정입니다.
진단 개선 사항
사용자들은 질문을 합니다. 이것은 정상적인 일입니다. 여러 사용자가 동일한 질문을 계속 물어볼 경우, 일부 사람들은 FAQ를 작성합니다만, 우리는 더 나은 방법을 선호합니다: IDE가 그들에게 답을 찾아내는 데 도움을 주길 원합니다. 예를 들면 다음과 같은 경우입니다:
if (foo is List) { // 에러!
...
}
컴파일러는 List에 타입 인수가 있어야 한다고 지적합니다. 예를 들어, ‘List<String>’이어야 합니다. 하지만 제네릭은 지워지므로, 런타임에서 무언가가 문자열 리스트인지 확인할 수 없습니다. 모든 것이 리스트라는 것만 알고 있습니다. 그리고 컴파일러도 그렇게 알고 있습니다:
if (foo is List<String>) { // 에러: 확인할 수 없습니다!
...
}
그래서 사용자는 궁지에 몰립니다: 타입 인수가 작동하지 않고, 인수 없이도 작동하지 않습니다. 이 때 IDE가 구원해 줍니다:
에러에서 Alt+Enter를 누르기만 하면됩니다(당신이 항상 그렇게 하듯이), 그러면 해결됩니다: 여기에 '스타 투영'이 필요합니다.
다운로드
Kotlin 플러그인은 몇 일 전에 출시된 IntelliJ IDEA 12가 필요합니다. 여기서 받을 수 있습니다(오픈 소스 커뮤니티 에디션도 사용 가능). Kotlin M4는 플러그인 저장소에서 다운로드할 수 있으며, IDE에서 접근할 수 있습니다.
여러분의 피드백은 언제나 환영입니다. 즐거운 Kotlin 되세요!
원문
'Kotlin > Release Notes' 카테고리의 다른 글
[Kotlin Release Notes] Kotlin M5.1 (0) | 2023.08.27 |
---|---|
[Kotlin Release Notes] Kotlin M5 is Out! (0) | 2023.08.27 |
[Kotlin Release Notes] Dogfooding Kotlin and M3.1 (0) | 2023.08.27 |
[Kotlin Release Notes] Kotlin M3 is Out! (0) | 2023.08.27 |
[Kotlin Release Notes] Kotlin M2 is Out! (0) | 2023.08.27 |
댓글