2013년 12월 6일
오늘 Kotlin M6.2를 출시하게 되어 여러 가지 흥미롭고 중요한 기능들을 선보이게 됐습니다. 최근에 출시된 IntelliJ IDEA 13도 지원합니다. 자세히 알아보겠습니다.
언어 개선
언어에 대한 기대되던 중요한 변화가 있습니다.
꼬리 호출 최적화
함수형 프로그래밍 팬들에게 좋은 소식입니다: Kotlin은 이제 꼬리 호출 최적화(TCO)를 지원합니다. 이로 인해 호출 스택이 폭발하는 위험 없이 함수형 스타일로 코드를 작성할 수 있게 됐습니다. 예를 들어, 반복자에 대한 왼쪽 fold는 다음과 같이 보일 수 있습니다:
tailRecursive
fun Iterator.foldl(acc : A, f : (e : T, acc : A) -> A) : A =
if (!hasNext()) acc
else foldl(f(next(), acc), f)
함수가 [tailRecursive]로 주석 처리되어 있음을 주목하세요: 이는 꼬리 호출이 최적화되길 원할 때 필수적입니다. 우리는 두 가지 이유로 TCO를 묵묵히 수행하지 않습니다:
- 디버깅: 꼬리 호출이 최적화된 함수는 실제로 재귀 호출을 하지 않기 때문에 디버거는 재귀를 나타내는 스택 프레임을 보여주지 않습니다. 따라서 코드에서 이를 명시적으로 나타내는 것이 가장 덜 놀랍습니다.
- 안전성: 코드가 종종 보이는 것처럼 동작하지 않는다는 것을 모두 압니다. 꼬리 호출도 마찬가지입니다. 종종 호출이 꼬리 호출처럼 보이지만 실제로는 그렇지 않습니다. 이로 인해 최적화가 이루어질 수 없고 성능이 저하됩니다. [tailRecursive] 주석을 사용하면 컴파일러는 어디서 호출이 최적화 가능해야 하는지 알고 오류를 범할 때 경고합니다.
이 기능으로 인해 funKTionale과 같은 함수 지향 라이브러리와 Kotlin의 표준 라이브러리가 이점을 볼 것으로 기대합니다.
Sergey Mashkov에게 이를 가능하게 한 기여에 감사드립니다.
상수 표현식
Kotlin은 타입에 대해 매우 엄격합니다: 심지어 숫자 타입도 암시적으로 서로 변환되지 않습니다. 이는 모든 타입이 동일한 방식으로(클래스로) 정의되고 Java가 때로는 보이는 이상한 특성을 피하기 위해 필요합니다. 다행히, 상수 표현식을 스마트하게 다루어 이러한 작은 불편함을 대부분 제거할 수 있습니다. 이제 이 작업이 완료되었고, 다음과 같은 일을 할 수 있습니다:
val x: Long = -1
또는
val b: Byte = -1
사실, 내부적으로 컴파일러는 오른쪽의 상수 표현식의 값을 계산하고 예상되는 타입(Long 또는 Byte)의 범위에 맞는지 확인한 후 상수를 변환합니다. 이와 동일한 작업이 비상수에 대해서는 수행되지 않습니다, 왜냐하면 그것들은 확인될 수 없기 때문입니다.
또한, 산술 오버플로우가 있을 경우 컴파일러가 경고합니다:
val monthInMilliseconds = 1000 * 60 * 60 * 24 * 30 // WARNING
여기서 결과는 Int 타입의 범위를 초과하고, 컴파일러가 이에 대해 경고합니다. 첫 번째 숫자를 Long으로 바꾸어 오버플로우를 수정할 수 있습니다:
val monthInMillisecondsL = 1000.toLong() * 60 * 60 * 24 * 30 // OK
하지만 이것은 너무 길다고 느낄 수 있습니다. 이제 숫자에 익숙한 “L” 접미사를 지원합니다:
val monthInMilliseconds = 1000L * 60 * 60 * 24 * 30 // OK
유명하게도 “l” 접미사는 많은 폰트에서 “1”과 매우 유사하게 보이기 때문에 허용되지 않습니다.
마찬가지로, “F” 접미사가 있는 float도 있습니다. 작은 “f”는 어떠한 숫자와도 유사하지 않게 보이며 전체적으로 더 쾌적하게 보이기 때문에 금지되지 않았습니다. :)
위의 이야기는 모두 정수 타입에 대한 것이지만, 부동 소수점 값은 까다롭습니다, 우리 모두가 알고 있듯이. 예를 들면:
println(0.1 < 0.1f) // "true"를 출력
이것은 이러한 10진수처럼 보이는 숫자의 2진 특성과 관련이 있으며, 변환들이 손실 없이 이루어지는 경우는 인간에게 직관적으로 보이지 않습니다. 따라서 부동 소수점 값을 자동으로 변환하지 않습니다. Double이 기본적으로 사용되며, float을 원한다면 명시적으로 지정하세요:
val fl: Float = 1.0f
Java 호환성
가변성 주석
Kotlin의 컬렉션은 읽기 전용 인터페이스를 가지고 있다는 것을 기억하십시오. 그렇다면 Java 라이브러리가 노출하는 컬렉션은 어떨까요? 잘 알려진 @Nullable/@NotNull과 함께 Kotlin은 이제 Java 컬렉션을 @ReadOnly 또는 @Mutable로 표시하기 위한 주석을 제공합니다.
다음과 같은 Java 코드가 있다고 가정해봅시다.
public List<EMail> activeEmails() {
...
}
이를 Kotlin에서 호출할 때 반환 값은 List<EMail>이고, Kotlin은 이를 MutableList로 취급합니다. 이제 이 메서드에 @ReadOnly 주석을 붙여 이 참조를 통해 리스트를 변경할 수 없게 할 수 있습니다.
@ReadOnly
public List<EMail> activeEmails() {
...
}
즉, 이제 add() 메서드를 호출할 수 없게 됩니다.
매개변수에 대해서도 동일한 작업을 할 수 있습니다. 다음과 같은 Java 메서드를 살펴봅시다.
void processEmails(List<EMail> emails) {
...
}
코틀린에서는 이것이 다음과 같이 표현됩니다.
fun processEmails(emails: List<EMail>)
이것은 다음과 같이 변환될 수 있습니다.
fun processEmails(emails: MutableList<EMail>)
원래의 자바 코드에 @Mutable 어노테이션을 추가함으로써
void processEmails(@Mutable List<EMail> emails) {
...
}
참고로, 이러한 어노테이션들은 당신의 자바 코드에 대한 훌륭한 문서화도 제공합니다.
코틀린의 널 가능성 유형에 대한 자바 지원
컴파일러는 이제 자바 바이트 코드에서 @Nullable과 @NotNull 어노테이션을 생성합니다. 이를 통해 IntelliJ IDEA는 이러한 어노테이션을 활용하여 자바에서 코틀린 코드를 호출할 때 널 가능성 위반에 대해 경고를 할 수 있습니다.
예를 들어
class Customer {
fun checkSocialSecurity(accountNumber: String) { ... }
}
이 코드가 자바에서 호출될 경우
Customer customer = new Customer();
customer.checkSocialSecurity(null); // WARNING
경고가 발생할 것입니다.
안드로이드 SDK
이제 우리는 전체 안드로이드 SDK에 대한 어노테이션을 제공하여, 안드로이드 프로젝트에서 더 쉽고 안전하게 작업할 수 있게 하였습니다.
자바에서 코틀린으로의 변환기
마지막으로, 완전히 자바 상호운용성과 관련이 있는 것은 아니지만, 자바에서 코틀린으로의 코드 변환기를 개선했습니다. 이로 인해 더 깔끔한 코드와 더 좋은 포매팅을 제공하게 되었습니다.
자바스크립트 개선사항
우리는 자바스크립트 컴파일러 지원을 계속 개선하고 있습니다. 이제 설정 | 기본 설정에서 Kotlin 컴파일러 페이지를 통해 소스 맵을 생성할 것인지, 그리고 어디에 위치시킬 것인지 설정할 수 있습니다.
또한 생성된 Kotlin 자바스크립트 코드에 대한 출력 파일 접두어와 접미어를 지정할 수 있습니다.
기본 인수가 있는 함수 문제와 슈퍼 생성자 호출을 지원하는 등 몇 가지 자바스크립트 관련 문제도 수정했습니다.
- 함수에 대한 기본 인수가 이제 수정되었습니다.
- 슈퍼 생성자 호출이 지원됩니다.
- 트레이트 내의 클래스 객체가 지원됩니다.
Ant 지원 개선사항
자바 컴파일러
typeDef를 사용하여 작업을 가져오면 기존의 <kotlinc> 작업뿐만 아니라 새로운 <withKotlin/> 작업에도 액세스할 수 있습니다. 이는 Java 컴파일러 작업 <javac>을 사용할 때 Kotlin 파일을 컴파일할 수 있게 하며, 후자에서 정의된 src 속성을 사용합니다.
자바스크립트 컴파일러
Ant를 사용하여 Kotlin을 자바스크립트로 컴파일할 수도 있습니다. 새로운 작업 <kotlin2js>가 있으며, 이를 사용하면 src와 출력 속성을 지정하여 Kotlin을 자바스크립트로 컴파일할 수 있습니다. IDE에서 사용 가능한 것과 유사한 다양한 추가 옵션도 제공됩니다, 예를 들면 소스맵을 활성화하거나 생성된 파일의 접두어와 접미어 등을 설정할 수 있습니다.
IDE 개선 사항
이제 컴파일러에 추가 명령 줄 매개변수를 제공하고 경고를 생성할지 여부도 선택할 수 있습니다.
또한, 다른 IDE 기능들도 개선/업데이트되었습니다:
- 스마트 완성: 아직 초기 단계이지만, 우리는 이미 Java에 대해 제공하고 있는 것처럼 Kotlin에서도 더 스마트한 완성을 제공하기 위해 작업 중입니다.
- 사용처 찾기: 성능이 향상되었습니다. 로컬 및 private 선언, 값/타입 매개변수 및 프로퍼티 게터/세터를 찾을 수 있으며, 몇 가지 버그 수정이 이루어졌습니다.
- 서명 변경 리팩터링: 이제 함수 계층을 지원합니다.
- 이름 변경 리팩터링: Java 코드에서 Kotlin 클래스와 함수의 이름을 변경하거나 Kotlin 기본 함수의 이름을 오버라이드할 때 발생하는 문제를 수정했습니다.
이 릴리스에서의 개선 사항 중 일부만을 다루었지만, Milestone 6.1 이후로 120개 이상의 문제가 해결되었습니다, 기능과 버그 수정을 포함하여.
다운로드
만약 IntelliJ 13을 사용하고 있다면, Kotlin M6.2는 이미 기본으로 사용 가능합니다. 그렇지 않다면 릴리스 페이지에서 컴파일러를, IntelliJ IDEA 저장소에서 플러그인을 다운로드할 수 있습니다.
원문
'Kotlin > Release Notes' 카테고리의 다른 글
[Kotlin Release Notes] M8 is out! (0) | 2023.08.28 |
---|---|
[Kotlin Release Notes] M7 Release Available (0) | 2023.08.28 |
[Kotlin Release Notes] M6.1 Released (0) | 2023.08.28 |
[Kotlin Release Notes] Kotlin M6 is here! (0) | 2023.08.27 |
[Kotlin Release Notes] Kotlin M5.3: IntelliJ IDEA 13, Delegated Properties and more (0) | 2023.08.27 |
댓글