2013년 2월 4일
Kotlin이 오픈 소스 프로젝트로 시작된 지 이제 두 주 후면 일년이 됩니다. 이 기간 동안 많은 노력과 커뮤니티의 큰 도움으로 164개의 풀 리퀘스트를 받았습니다, 즉 대략 이틀에 하나씩의 기여가 이루어진 것입니다. 오늘, 우리는 또 다른 단계를 밟고 Kotlin M5를 출시합니다. 이 블로그 글은 이번 릴리스에서 소개된 변경 사항을 다룹니다.
개요
M5는 짧은 마일스톤이었지만(새해 휴가를 제외하면), 트래커에서 144개의 이슈를 해결했습니다.
많은 IDE 하위 시스템이 개선되었으며, JUnit 러너, Java에서 Kotlin 클래스 검색, 유효하지 않은 외부 어노테이션에 대한 더 나은 진단, 새로운 아이콘과 Darcula 컬러 스킴에 대한 지원 등이 있습니다.
언어의 소소한 변경으로는 Float 리터럴에 대한 더 나은 지원(이제 Float이 예상될 경우 1.0이라고 간단히 말할 수 있습니다)과 함수 호출에 위치와 명명된 인수를 혼합할 수 있는 기능이 있습니다.
일부 변경은 그리 작지 않고 기존 코드를 수정해야 할 수도 있습니다...
패키지 클래스
이전 버전의 Kotlin에서는 최상위 함수나 속성이 선언된 모든 패키지가 “namespace”라는 이름의 클래스로 컴파일되었습니다. Java에서 이러한 "namespace" 클래스를 둘 이상 사용할 경우 이름 충돌이 발생했습니다. Kotlin M5에서는 패키지 클래스가 각각의 패키지 이름을 따르게 되어 이 문제를 해결합니다.
이 명명 규칙은 다음과 같이 작동합니다: “org.example” 패키지는 “org.example.ExamplePackage”라는 클래스를 얻습니다. 즉, 패키지의 간단한 이름을 취해 대문자로 시작하고 “Package”를 추가하여 그 클래스를 패키지 자체에 넣습니다. 지금까지는 잘 작동하고 있습니다.
참고: 이러한 변경으로 인해 이전 버전의 kotlin-runtime.jar는 더 이상 작동하지 않습니다. 컴파일러는 "호환되지 않는 ABI 버전"이라고 불평하고, IDE는 이전 런타임 jar를 새로운 것으로 교체하도록 제안할 것입니다.
내부 클래스
내부 클래스는 비정적 중첩 클래스입니다, 즉 외부 인스턴스에 대한 참조를 보유하고 있습니다. Java에서 중첩 클래스는 기본적으로 내부 클래스이며, 외부 참조를 원하지 않는 경우 클래스를 정적으로 만듭니다. 때로는 이것이 메모리 누수로 이어질 수 있습니다.
M5부터 Kotlin은 내부 클래스를 명시적으로 표시하도록 요구하며, 중첩 클래스는 기본적으로 "정적"입니다. 이것은 기존 코드를 깨뜨릴 수 있으며, IDE에는 편리한 퀵픽스가 있습니다(에러에서 Alt+Enter를 누르면 됩니다).
자바 제네릭과 Nullability
제네릭은 까다롭고, nullable 타입과의 조합은 더욱 까다롭습니다. Java에서는 모든 것이 nullable입니다, 예를 들어, Java 메서드 foo(ArrayList<String>)를 고려하면, Kotlin(5M 이전)은 이를 ArrayList<String?>?로 봤습니다, 즉 컬렉션도 null일 수 있고 그 요소도 null일 수 있습니다. 이것이 우리가 할 수 있는 가장 안전한 일이지만, 매우 불편했습니다: Kotlin에서 ArrayList<String>이 있으면 foo()에 전달할 수 없습니다. ArrayList는 제네릭 매개변수에서 불변이기 때문에 ArrayList<String>은 ArrayList<String?>의 하위 타입이 아닙니다. 이로 인해 많은 문제가 발생했으며, KAnnotator가 사용되더라도 마찬가지였습니다.
그래서 우리는 제네릭 인수 타입에 대한 기본 전략을 변경하기로 결정했고, 위의 경우에 ArrayList<String>?를 로드합니다.
이 변경으로 인해 일부 기존 코드가 깨질 수 있습니다. 대부분은 불필요한 물음표를 제거함으로써 간단하게 수정할 수 있습니다. 이전 타입을 원한다면 Java 정의에 외부 어노테이션을 추가할 수 있습니다.
그럼 안전성은 어떨까요? 이제 Java 코드가 문자열 대신 null의 컬렉션을 줌으로써 당신을 속일 수 있으며, 당신의 Kotlin 코드가 실패할 것입니다. 이것이 일어날 수 있지만, 우리는 그것이 도움이 되도록 실패하게 합니다: Kotlin은 Java로부터 받은 데이터를 검사하고, 다음과 같은 자세한 오류 메시지와 함께 조기에 실패합니다.
Exception in thread "main" java.lang.IllegalStateException:
Method specified as non-null returned null: JavaClass.foo
at _DefaultPackage.main(hello.kt:4)
이것은 나중에 NPE가 발생할 수도 있는 것보다 훨씬 나습니다. 같은 종류의 검사가 함수 매개변수에 대해서도 수행됩니다: 누군가가 null을 불법적으로 전달하여 Kotlin 함수를 호출하면, 그것은 조기에 폭발하며 가능한 한 정확하게 유죄를 뒤집을 것입니다.
가변 인수와 함수 리터럴
Kotlin의 타입-안전 빌더는 놀랍습니다, 특히 그것들이 내장 메커니즘이 아니라 좋은 언어 기능(주로 확장 함수와 고차 함수)의 조합이라는 것을 알게 되면 더욱 그렇습니다. Kotlin의 이전 버전에서 빌더 작성자들을 괴롭힌 것 중 하나는, 괄호 밖에서 함수 리터럴을 인수로 취할 수 있는 vararg 함수를 정의할 수 없었다는 것이었습니다. 이제는 가능합니다:
fun css(vararg selectors: Selector, body: Element.() -> Unit) {...}
는 다음과 같이 호출할 수 있습니다.
css(TD, _class("data")) {
background_color = RED
}
당신은 명명된 인수와 위치 인수를 함께 사용할 수도 있습니다(가변 인수 포함):
css(TD, body = foo)
범위
Kotlin의 표준 라이브러리도 발전하고 있으며, 이번에는 범위를 수정했습니다. 참고로, 범위는 루프와 조건문에서 많이 사용됩니다:
for (i in 1..10) { /* 1, 2, 3, ..., 10 */ }
if (x in low..high) { /* low <= x <= high */ }
새로운 범위는 내부적으로 더 일관되고, 내림 차순 반복, 비일상적인 증가 등의 경우에 적절하게 일반화됩니다. 우리는 이번 주에 이에 대한 자세한 내용을 다룰 별도의 블로그 글을 제공할 것입니다.
기본 생성자
Kotlin은 클래스당 하나의 생성자만 허용합니다. 데이터를 모델링할 때, 생성자 매개변수에 대한 기본 값을 자주 사용합니다(결국, 이것이 하나의 생성자만 가지는 것을 실용적으로 만듭니다):
class Bean(val data: Integer = 0)
이제 생성자는 더욱 편리해졌습니다: 생성된 바이트 코드에서 이 클래스는 기본 생성자를 얻게 됩니다, 즉 인수를 전혀 취하지 않는 생성자(그것들에 대한 기본값을 사용합니다). 이 경우는 JAXB와 같은 Java 프레임워크를 사용할 때 자주 발생하므로, 이제 Kotlin은 더욱 Java 친화적이게 되었습니다.
결론
Kotlin M5는 플러그인 저장소에서 다운로드할 수 있습니다. IntelliJ IDEA 12가 필요하며(최근에 출시된 12.0.3 사용이 권장됩니다).
좋은 Kolin 되세요!
원문
'Kotlin > Release Notes' 카테고리의 다른 글
[Kotlin Release Notes] Kotlin M5.2: IntelliJ IDEA 12.1 and Gradle (0) | 2023.08.27 |
---|---|
[Kotlin Release Notes] Kotlin M5.1 (0) | 2023.08.27 |
[Kotlin Release Notes] Kotlin M4 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 |
댓글