코틀린 1.8.0 버전이 2022년 12월 28일에 정식으로 출시되었습니다. 새로운 코틀린 버전이 출시되면서 어떤 부분이 변경되었는지 업데이트를 요약해 보았습니다.
IDE 지원
kotlin-reflect 성능 개선
최적화 비활성화를 위한 컴파일러 옵션
JVM 컴파일 Target 업데이트
Java에서 Kotlin으로 TimeUnit 전환
Gradle 7.2 & 7.3
Lombok @Builder 어노테이션 지원
코틀린 멀티플랫폼 : 새로운 안드로이드 소스세트 레이아웃
기타
코틀린 1.8.0 플러그인은 아래 IDE 버전에서 사용할 수 있습니다.
IDE | Supported versions |
---|---|
IntelliJ IDEA | 2021.3, 2022.1, 2022.2 |
Android Studio | Electric Eel (221), Flamingo (222) |
kotlin-reflect가 JVM target 1.8로 컴파일 된다는 이점을 활용하여 내부 캐시 메커니즘을 Java의 ClassValue
로 마이그레이션 하면서 기존에만 캐싱하던 KClass
와 더불어 이제는 KType
그리고 KDeclarationContainer
까지 캐싱됩니다. 이러한 변경으로 typeOf()
가 호출할 때 큰 성능 향상을 가져갈 수 있습니다.
코틀린 1.8.0에서는 더 나은 디버깅 환경을 위해 최적화 옵션을 비활성화하는 -Xdebug
컴파일러 옵션이 추가되었습니다. 이 옵션을 활성화하면 코루틴의 was optimized out
기능이 비활성화 됩니다. 앞으로는 더 많은 최적화를 비활성화 할 수 있는 옵션들이 추가될 예정입니다.
was optimized out
은 일시 중단 함수를 사용할 때 변수들을 최적화하는 기능입니다. 하지만 최적화된 변수를 볼 수 없어 코드를 디버깅 하기에는 어려움이 따릅니다.
-Xdebug
를 통해 이 기능을 비활성화 하면 메모리 누수가 발생할 수 있으므로이 옵션은 프로덕션에서는 절대 사용해서는 안됩니다.
Kotlin 1.8.0 버전부터 코틀린 컴파일러는 JVM 버전 19를 지원합니다.
기존에 JVM target 1.6에서 컴파일되었던 코틀린 표준 라이브러리(kotlin-stdlib
, kotlin-reflect
, and kotlin-script-*
)가 JVM target 1.8로 컴파일 됩니다. 또한 코틀린 1.8.0에서는 JVM target 1.6 그리고 1.7을 지원하지 않습니다. 결과적으로 이러한 아티팩트들이 kotlin-stdlib
로 병합되기 때문에 빌드 스크립트를 더 이상 kotlin-stdlib-jdk7
and kotlin-stdlib-jdk8
을 분리해서 선언하지 않아도 됩니다.
:blue_book: 빌드 스크립트에서
kotlin-stdlib-jdk7
이나kotlin-stdlib-jdk8
이 명시적으로 선언되어있는 경우kotlin-stdlib
로 바꿔야 합니다.
서로 다른 버전의 코틀린 표준 라이브러리를 섞어서 사용한다면 클래스가 중복되거나 누락될 가능성이 있습니다. 이를 방지하기 위해 Kotlin Gradle 플러그인을 사용하면 표준 라이브러리 정렬에 도움이 됩니다.
Kotlin 1.6.0에서 실험적이었던 toTimeUnit()
그리고 toDurationUnit()
기능들은 kotlin.time
패키지에서 스테이블 되었습니다. 이 함수들은 Java와 Kotlin의 상호운용성을 향상시키며 이제는 Java의 java.util.concurrent.TimeUnit
을 Kotlin의 kotlin.time.DurationUnit
으로 쉽게 전환할 수 있습니다. 이 함수들은 JVM에서만 지원합니다.
코틀린 1.8.0은 Gradle 버전 7.2와 7.3을 완전히 지원합니다. Gradle 최소 지원 버전은 6.8.3 이며 Android Gradle 플러그인은 4.1.3 입니다. Gradle 버전을 최신 릴리즈 버전까지 사용할 수 있으나 지원 중단 경고가 표시되거나 새로운 Gradle 기능이 동작하지 않을 수도 있습니다.
많은 커뮤니티에서 코틀린 Lombok의 @Builder 어노테이션을 지원해달라는 요청이 많았고 1.8.0부터는 해당 어노테이션을 지원합니다. Lombok을 사용하려면 gradle 플러그인을 추가해야 합니다.
plugins {
kotlin("plugin.lombok") version "1.8.0"
id("io.freefair.lombok") version "5.3.0"
}
아직 @SuperBuilder
혹은 @Tolerate
어노테이션을 지원할 계획은 없지만 많은 사람들의 요구가 있을 때 고려해볼 수 있습니다.
코틀린 1.8.0부터는 여러 면에서 혼란스러웠던 디렉터리들의 네이밍 스키마들을 대체하는 새로운 안드로이드 소스세트 레이아웃 도입되었습니다.
AndroidTest
디렉터리를 예로 들면 하나는 KotlinSourceSets
이었고 다른 하나는 AndroidSourceSets
였습니다.
androidTest
는 unitTest
형태를 의미하지만 안드로이드 진영에서는 interationTest
를 의미합니다.src/androidTest/java
는 UnitTest
가 있고 src/androidTest/kotlin
는 InstrumentedTest
가 있는 혼란스러운 SourceDirectories
레이아웃을 만듭니다.KotlinSourceSets
그리고 AndroidSourceSets
모두 Gradle 구성에 비슷한 네이밍 스키마를 사용하므로 androidTest
의 결과 구성들은 androidTestImplementation
, androidTestApi
, androidTestRuntimeOnly
그리고 androidTestCompileOnly
와 같습니다.현재 소스 세트 레이아웃 | 새로운 소스 세트 레이아웃 |
---|---|
targetName + AndroidSourceSet.name | targetName + AndroidVariantType |
현재 소스 세트 레이아웃 | 새로운 소스 세트 레이아웃 | |
---|---|---|
main | androidMain | androidMain |
test | androidTest | androidUnitTest |
androidTest | androidAndroidTest | androidInstrumentedTest |
현재 소스 세트 레이아웃 | 새로운 소스 세트 레이아웃 |
---|---|
The layout adds additional /kotlin SourceDirectories | src/{AndroidSourceSet.name}/kotlin , src/{KotlinSourceSet.name}/kotlin |
현재 소스 세트 레이아웃 | 새로운 소스 세트 레이아웃 | |
---|---|---|
main | src/androidMain/kotlin, src/main/kotlin, src/main/java | src/androidMain/kotlin, src/main/kotlin, src/main/java |
test | src/androidTest/kotlin, src/test/kotlin, src/test/java | src/androidUnitTest/kotlin, src/test/kotlin, src/test/java |
androidTest | src/androidAndroidTest/kotlin, src/androidTest/java | src/androidInstrumentedTest/kotlin, src/androidTest/java, src/androidTest/kotlin |
현재 소스 세트 레이아웃 | 새로운 소스 세트 레이아웃 |
---|---|
src/{AndroidSourceSet.name}/...Manifest.xml | src/{KotlinSourceSet.name}/...Manifest.xml |
현재 소스 세트 레이아웃 | 새로운 소스 세트 레이아웃 | |
---|---|---|
main | src/main/AndroidManifest.xml | src/androidMain/AndroidManifest.xml |
debug | src/debug/AndroidManifest.xml | src/androidDebug/AndroidManifest.xml |
지금까지 긴 글 읽어 주셔서 감사합니다.