[Kotlin] 1.8.0 업데이트 요약

케니스·2023년 1월 27일
0

Kotlin

목록 보기
2/5

코틀린 1.8.0 버전이 2022년 12월 28일에 정식으로 출시되었습니다. 새로운 코틀린 버전이 출시되면서 어떤 부분이 변경되었는지 업데이트를 요약해 보았습니다.

  • IDE 지원

  • kotlin-reflect 성능 개선

  • 최적화 비활성화를 위한 컴파일러 옵션

  • JVM 컴파일 Target 업데이트

  • Java에서 Kotlin으로 TimeUnit 전환

  • Gradle 7.2 & 7.3

  • Lombok @Builder 어노테이션 지원

  • 코틀린 멀티플랫폼 : 새로운 안드로이드 소스세트 레이아웃

  • 기타

IDE 지원

코틀린 1.8.0 플러그인은 아래 IDE 버전에서 사용할 수 있습니다.

IDESupported versions
IntelliJ IDEA2021.3, 2022.1, 2022.2
Android StudioElectric Eel (221), Flamingo (222)

kotlin-reflect 성능 개선

kotlin-reflect가 JVM target 1.8로 컴파일 된다는 이점을 활용하여 내부 캐시 메커니즘을 Java의 ClassValue로 마이그레이션 하면서 기존에만 캐싱하던 KClass와 더불어 이제는 KType 그리고 KDeclarationContainer까지 캐싱됩니다. 이러한 변경으로 typeOf()가 호출할 때 큰 성능 향상을 가져갈 수 있습니다.

최적화 비활성화를 위한 컴파일러 옵션

코틀린 1.8.0에서는 더 나은 디버깅 환경을 위해 최적화 옵션을 비활성화하는 -Xdebug 컴파일러 옵션이 추가되었습니다. 이 옵션을 활성화하면 코루틴의 was optimized out기능이 비활성화 됩니다. 앞으로는 더 많은 최적화를 비활성화 할 수 있는 옵션들이 추가될 예정입니다.

was optimized out은 일시 중단 함수를 사용할 때 변수들을 최적화하는 기능입니다. 하지만 최적화된 변수를 볼 수 없어 코드를 디버깅 하기에는 어려움이 따릅니다.

-Xdebug 를 통해 이 기능을 비활성화 하면 메모리 누수가 발생할 수 있으므로

이 옵션은 프로덕션에서는 절대 사용해서는 안됩니다.

JVM 컴파일 Target 업데이트

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 플러그인을 사용하면 표준 라이브러리 정렬에 도움이 됩니다.

Java에서 Kotlin으로 TimeUnit 전환

Kotlin 1.6.0에서 실험적이었던 toTimeUnit() 그리고 toDurationUnit()기능들은 kotlin.time 패키지에서 스테이블 되었습니다. 이 함수들은 Java와 Kotlin의 상호운용성을 향상시키며 이제는 Java의 java.util.concurrent.TimeUnit을 Kotlin의 kotlin.time.DurationUnit으로 쉽게 전환할 수 있습니다. 이 함수들은 JVM에서만 지원합니다.

Gradle 7.2 & 7.3

코틀린 1.8.0은 Gradle 버전 7.2와 7.3을 완전히 지원합니다. Gradle 최소 지원 버전은 6.8.3 이며 Android Gradle 플러그인은 4.1.3 입니다. Gradle 버전을 최신 릴리즈 버전까지 사용할 수 있으나 지원 중단 경고가 표시되거나 새로운 Gradle 기능이 동작하지 않을 수도 있습니다.

Lombok @Builder 어노테이션 지원

많은 커뮤니티에서 코틀린 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 였습니다.

  • 코틀린의 androidTestunitTest 형태를 의미하지만 안드로이드 진영에서는 interationTest를 의미합니다.
  • src/androidTest/javaUnitTest가 있고 src/androidTest/kotlinInstrumentedTest가 있는 혼란스러운 SourceDirectories 레이아웃을 만듭니다.
  • KotlinSourceSets 그리고 AndroidSourceSets 모두 Gradle 구성에 비슷한 네이밍 스키마를 사용하므로 androidTest의 결과 구성들은 androidTestImplementation, androidTestApi, androidTestRuntimeOnly 그리고 androidTestCompileOnly 와 같습니다.

KotlinSourceSet 네이밍 스키마

현재 소스 세트 레이아웃새로운 소스 세트 레이아웃
targetName + AndroidSourceSet.nametargetName + AndroidVariantType
현재 소스 세트 레이아웃새로운 소스 세트 레이아웃
mainandroidMainandroidMain
testandroidTestandroidUnitTest
androidTestandroidAndroidTestandroidInstrumentedTest

SourceDirectories

현재 소스 세트 레이아웃새로운 소스 세트 레이아웃
The layout adds additional /kotlin SourceDirectoriessrc/{AndroidSourceSet.name}/kotlin, src/{KotlinSourceSet.name}/kotlin
현재 소스 세트 레이아웃새로운 소스 세트 레이아웃
mainsrc/androidMain/kotlin, src/main/kotlin, src/main/javasrc/androidMain/kotlin, src/main/kotlin, src/main/java
testsrc/androidTest/kotlin, src/test/kotlin, src/test/javasrc/androidUnitTest/kotlin, src/test/kotlin, src/test/java
androidTestsrc/androidAndroidTest/kotlin, src/androidTest/javasrc/androidInstrumentedTest/kotlin, src/androidTest/java, src/androidTest/kotlin

AndroidManifest.xml 파일 위치

현재 소스 세트 레이아웃새로운 소스 세트 레이아웃
src/{AndroidSourceSet.name}/...Manifest.xmlsrc/{KotlinSourceSet.name}/...Manifest.xml
현재 소스 세트 레이아웃새로운 소스 세트 레이아웃
mainsrc/main/AndroidManifest.xmlsrc/androidMain/AndroidManifest.xml
debugsrc/debug/AndroidManifest.xmlsrc/androidDebug/AndroidManifest.xml

기타

  • Xcode 14.1 지원
  • Objective-C/Swift 와의 상호운용성 향상
  • CocoaPods Gradle 플러그인에서 Dynamic frameworks를 기본으로 연결

지금까지 긴 글 읽어 주셔서 감사합니다.

참고

profile
노력하는 개발자입니다.

0개의 댓글