2020년 11월 23일
Kotlin 1.4.20에서는 여러 개의 실험적인 기능을 제공하며, 기존 기능에 대한 수정과 개선도 포함되어 있습니다. 이 중에서도 1.4.0에서 추가된 기능도 포함되어 있습니다.
더 많은 예제와 함께 새로운 기능에 대해 알아보려면 이 블로그 포스트를 확인하세요.
Kotlin/JVM
Kotlin/JVM의 개선 사항은 현대 Java 버전의 기능과 따라가도록 의도되었습니다:
- Java 15 대상
- invokedynamic 문자열 연결
Java 15 대상
이제 Java 15가 Kotlin/JVM 대상으로 사용 가능합니다.
invokedynamic 문자열 연결
invokedynamic 문자열 연결은 실험적입니다. 언제든지 폐기되거나 변경될 수 있습니다. 사용하려면 옵트인(아래의 자세한 내용 참조)이 필요합니다. 평가 목적으로만 사용하세요. YouTrack에서의 피드백을 환영합니다.
Kotlin 1.4.20은 JVM 9+ 대상에서 문자열 연결을 동적 호출(invokedynamic)로 컴파일할 수 있으므로 성능을 향상시킵니다.
현재 이 기능은 실험적이며 다음과 같은 경우를 포함합니다:
- 연산자(a + b), 명시적 (a.plus(b)), 참조 ((a::plus)(b)) 형식의 String.plus.
- 인라인 및 데이터 클래스에서의 toString.
- 단일 비상수 인자가 없는 문자열 템플릿(KT-42457 제외).
invokedynamic 문자열 연결을 활성화하려면 다음 값 중 하나를 사용하여 -Xstring-concat 컴파일러 옵션을 추가하세요:
- invokedynamic 연결을 수행하려면 문자열의 StringConcatFactory.makeConcatWithConstants()를 사용하여 indy-with-constants.
- invokedynamic 연결을 수행하려면 문자열의 StringConcatFactory.makeConcat()을 사용하여 indy.
- 클래식한 연결로 돌아가려면 StringBuilder.append()를 통해 inline.
Kotlin/JS
Kotlin/JS는 계속 빠르게 발전하며, 1.4.20에서는 여러 실험적인 기능과 개선 사항이 제공됩니다:
- Gradle DSL 변경
- 새로운 마법사 템플릿
- IR 컴파일러를 사용하여 컴파일 오류 무시
Gradle DSL 변경
Kotlin/JS의 Gradle DSL은 프로젝트 설정 및 사용자 정의를 간소화하는 여러 업데이트를 받습니다. 이에는 웹팩(webpack) 구성 조정, 자동 생성된 package.json 파일 수정 및 종속성에 대한 향상된 제어가 포함됩니다.
웹팩 구성을 위한 단일 포인트
브라우저 대상에는 commonWebpackConfig라는 새로운 구성 블록이 있습니다. 이 블록 안에서 webpackTask, runTask 및 testTask의 구성을 중복하지 않고도 공통 설정을 조정할 수 있습니다.
모든 세 가지 작업에 대한 기본적인 CSS 지원을 활성화하려면 프로젝트의 build.gradle(.kts)에 다음 스니펫을 추가하세요:
browser {
commonWebpackConfig {
cssSupport.enabled = true
}
binaries.executable()
}
더 자세한 웹팩 번들링 구성에 대한 정보는 여기에서 확인하세요.
Gradle DSL을 통한 package.json 사용자 정의
Kotlin/JS 패키지 관리 및 배포에 대한 더 많은 제어를 위해 이제 Gradle DSL을 통해 프로젝트 파일 package.json에 속성을 추가할 수 있습니다.
package.json에 사용자 정의 필드를 추가하려면 compilation의 packageJson 블록에서 customField 함수를 사용하세요:
kotlin {
js(BOTH) {
compilations["main"].packageJson {
customField("hello", mapOf("one" to 1, "two" to 2))
}
}
}
package.json 사용자 정의에 대해 더 알아보세요.
선택적 yarn 종속성 해결 지원
선택적 yarn 종속성 해결 지원은 실험적입니다. 언제든지 폐기되거나 변경될 수 있습니다. 평가 목적으로만 사용하세요. YouTrack에서의 피드백을 환영합니다.
Kotlin 1.4.20은 패키지에 대한 종속성을 재정의하는 메커니즘인 Yarn의 선택적 종속성 해결을 구성할 수 있는 방법을 제공합니다.
이를 사용하려면 Gradle의 YarnPlugin 내에서 YarnRootExtension을 사용할 수 있습니다. 프로젝트의 패키지에 대한 해결 버전을 설정하려면 resolution 함수를 사용하여 패키지 이름 선택기(Yarn에서 지정한 대로)와 해당 패키지가 해결될 버전을 전달하세요.
rootProject.plugins.withType<YarnPlugin> {
rootProject.the<YarnRootExtension>().apply {
resolution("react", "16.0.0")
resolution("processor/decamelize", "3.0.0")
}
}
이렇게 하면 react를 필요로 하는 모든 npm 종속성이 버전 16.0.0을 받고, processor는 버전 3.0.0의 decamelize를 받게 됩니다.
세분화된 작업 공간 비활성화
세분화된 작업 공간 비활성화는 실험적입니다. 언제든지 폐기되거나 변경될 수 있습니다. 평가 목적으로만 사용하세요.
YouTrack에서의 피드백을 환영합니다.
빌드 시간을 빠르게 하기 위해 Kotlin/JS Gradle 플러그인은 특정 Gradle 작업에 필요한 종속성만 설치합니다. 예를 들어 webpack-dev-server 패키지는 *Run 작업 중 하나를 실행할 때만 설치되며 assemble 작업을 실행할 때는 설치되지 않습니다. 이러한 동작은 병렬로 여러 Gradle 프로세스를 실행할 때 문제를 일으킬 수 있습니다. 종속성 요구 사항이 충돌하면 두 개의 npm 패키지 설치가 오류를 일으킬 수 있습니다.
이 문제를 해결하기 위해 Kotlin 1.4.20에는 이른바 granular workspaces라고 하는 이러한 기능을 비활성화하는 옵션이 포함되어 있습니다. 현재 이 기능은 Gradle의 YarnPlugin 내에서 YarnRootExtension을 통해 사용할 수 있습니다. 이를 사용하려면 build.gradle.kts 파일에 다음 스니펫을 추가하세요:
rootProject.plugins.withType<YarnPlugin> {
rootProject.the<YarnRootExtension>().disableGranularWorkspaces()
}
새로운 마법사 템플릿
프로젝트 생성 중에 프로젝트를 더 편리하게 사용자 정의하기 위한 새로운 템플릿을 제공하는 Kotlin 프로젝트 마법사에는 다음과 같은 Kotlin/JS 애플리케이션을 위한 새로운 템플릿이 포함되어 있습니다:
- Browser Application - 브라우저에서 실행되는 최소한의 Kotlin/JS Gradle 프로젝트입니다.
- React Application - 적절한 kotlin-wrappers를 사용하는 React 앱입니다. 스타일 시트, 네비게이션 컴포넌트 또는 상태 컨테이너에 대한 통합을 활성화할 수 있는 옵션을 제공합니다.
- Node.js Application - Node.js 런타임에서 실행하기 위한 최소한의 프로젝트입니다. 실험적인 kotlinx-nodejs 패키지를 직접 포함할 수 있는 옵션이 제공됩니다.
IR 컴파일러를 사용하여 컴파일 오류 무시
컴파일 오류 무시 모드는 실험적입니다. 언제든지 폐기되거나 변경될 수 있습니다. 옵트인(아래의 자세한 내용 참조)이 필요합니다. 평가 목적으로만 사용하세요. YouTrack에서의 피드백을 환영합니다.
Kotlin/JS IR 컴파일러는 새로운 실험적인 모드인 오류가 있는 상태에서 컴파일 모드를 제공합니다. 이 모드에서는 코드에 오류가 포함되어 있더라도 코드를 실행할 수 있습니다. 예를 들어 전체 애플리케이션이 아직 준비되지 않았을 때 특정 기능을 시험해 보고 싶다면 사용할 수 있습니다.
이 모드에는 두 가지 허용 정책이 있습니다:
- SEMANTIC: 컴파일러는 구문적으로 올바른 코드를 허용하지만 의미론적으로 맞지 않는 코드도 허용합니다. 예를 들어 val x: String = 3와 같이 의미론적으로 맞지 않는 코드를 허용합니다.
- SYNTAX: 컴파일러는 문법 오류가 포함된 경우를 포함하여 모든 코드를 허용합니다.
컴파일 오류를 무시하려면 -Xerror-tolerance-policy= 컴파일러 옵션을 위의 값 중 하나와 함께 추가하세요.
Kotlin/JS IR 컴파일러를 사용하여 컴파일 오류를 무시하는 자세한 내용은 여기에서 확인하세요.
Kotlin/Native
Kotlin/Native의 1.4.20에서의 주요 우선 순위는 성능 향상과 기존 기능 개선입니다. 다음은 주목할만한 개선 사항입니다.
- Escape analysis
- 성능 개선 및 버그 수정
- Objective-C 예외 래핑 옵트인
- CocoaPods 플러그인 개선
- Xcode 12 라이브러리 지원
Escape analysis
이 탈출 분석 메커니즘은 실험적입니다. 언제든지 폐기되거나 변경될 수 있습니다. 평가 목적으로만 사용하세요. YouTrack에서의 피드백을 환영합니다.
Kotlin/Native에는 새로운 escape analysis 메커니즘이 프로토타입으로 도입되었습니다. 이 메커니즘은 힙(heap) 대신 스택(stack)에 특정 객체를 할당함으로써 런타임 성능을 향상시킵니다. 이 메커니즘은 벤치마크에서 평균 성능 향상률이 10%를 나타내며, 더 많은 프로그램 성능 향상을 위해 계속 개선 중입니다.
Escape analysis는 릴리스 빌드를 위한 별도의 컴파일 단계에서 실행됩니다 (-opt 컴파일러 옵션 사용).
Escape analysis 단계를 비활성화하려면 -Xdisable-phases=EscapeAnalysis 컴파일러 옵션을 사용하세요.
성능 개선 및 버그 수정
Kotlin/Native는 다양한 구성 요소, 특히 1.4.0에서 추가된 요소들을 포함하여 성능 개선 및 버그 수정을 받았습니다.
Objective-C 예외 래핑 옵트인
Objective-C 코드에서 실행 중 발생하는 예외를 방지하기 위해 Kotlin/Native는 이제 Objective-C 예외를 처리할 수 있습니다.
NSException을 Kotlin의 ForeignException 유형의 예외로 래핑할 수 있도록 옵트인할 수 있습니다. 이렇게 하면 원래의 NSException에 대한 참조를 보유하며 루트 원인 정보를 얻고 적절하게 처리할 수 있습니다.
Objective-C 예외 래핑을 활성화하려면 cinterop 호출에서 -Xforeign-exception-mode objc-wrap 옵션을 지정하거나 .def 파일에 foreignExceptionMode = objc-wrap 속성을 추가하세요. CocoaPods 통합을 사용하는 경우, 의존성을 포함한 종속성의 pod {} 빌드 스크립트 블록에 다음과 같이 옵션을 지정하세요:
pod("foo") {
extraOpts = listOf("-Xforeign-exception-mode", "objc-wrap")
}
기본 동작은 변경되지 않습니다. Objective-C 코드에서 예외가 throw되면 프로그램이 종료됩니다.
CocoaPods 플러그인 개선
Kotlin 1.4.20은 CocoaPods 통합을 개선하기 위한 일련의 개선 사항을 계속 제공합니다. 다음과 같은 새로운 기능을 시도해 볼 수 있습니다:
- 개선된 작업 실행
- 확장된 DSL
- Xcode와의 통합 업데이트
개선된 작업 실행
CocoaPods 플러그인은 개선된 작업 실행 흐름을 받았습니다. 예를 들어 새 CocoaPods 종속성을 추가하면 기존 종속성이 다시 빌드되지 않습니다. 추가한 추가 타겟도 기존 타겟의 종속성 다시 빌드에 영향을 주지 않습니다.
확장된 DSL
Kotlin 프로젝트에 CocoaPods 종속성을 추가하는 DSL이 새로운 기능을 받았습니다.
로컬 Pods 및 CocoaPods 리포지토리의 Pods 외에도 다음 유형의 라이브러리에 종속성을 추가할 수 있습니다:
- 사용자 지정 스펙 리포지토리의 라이브러리.
- Git 리포지토리에서 원격 라이브러리.
- 아카이브에서의 라이브러리 (임의의 HTTP 주소에서도 사용 가능).
- 정적 라이브러리.
- 사용자 정의 cinterop 옵션을 가진 라이브러리.
Kotlin 프로젝트에 CocoaPods 종속성을 추가하는 자세한 내용은 Kotlin 프로젝트에 CocoaPods 종속성 추가에서 확인할 수 있으며, Kotlin with CocoaPods 샘플에서 예제를 찾을 수 있습니다.
Xcode와의 통합 업데이트
Xcode와의 올바른 작업을 위해 Kotlin은 일부 Podfile 변경이 필요합니다:
- Kotlin Pod에 Git, HTTP 또는 specRepo Pod 종속성이 있는 경우 Podfile에 해당 종속성을 지정해야 합니다.
- 사용자 지정 스펙에서 라이브러리를 추가하는 경우 Podfile의 시작 부분에 spec 위치를 지정해야 합니다.
이제 IDEA에서 통합 오류에는 자세한 설명이 포함되어 있습니다. 따라서 Podfile에 문제가 있는 경우 즉시 어떻게 수정해야 하는지 알 수 있습니다.
자세한 건 여기서 확인해보세요.
Xcode 12 라이브러리를 지원
Kotlin 1.4.20으로 제공된 Xcode 12 라이브러리 지원을 추가했습니다. 이제 Kotlin 코드에서 이러한 라이브러리를 사용할 수 있습니다.
Kotlin Multiplatform
다중 플랫폼 라이브러리 게시물의 업데이트된 구조
Kotlin 1.4.20부터는 별도의 메타데이터 게시물이 더 이상 없습니다. 메타데이터 아티팩트는 이제 라이브러리 전체를 나타내는 루트 게시물에 포함되며, 공통 소스 세트에 종속성으로 추가될 때 자동으로 적절한 플랫폼별 아티팩트로 해결됩니다.
다중 플랫폼 라이브러리 게시에 대해 더 알아보기
이전 버전과의 호환성
이 구조 변경으로 인해 계층적 프로젝트 구조를 가진 프로젝트 간의 호환성이 깨집니다. 다중 플랫폼 프로젝트와 그에 의존하는 라이브러리가 모두 계층적 프로젝트 구조를 가지고 있는 경우, Kotlin 1.4.20 이상으로 업데이트해야 합니다. Kotlin 1.4.20으로 게시된 라이브러리는 이전 버전으로 게시된 프로젝트에서 사용할 수 없습니다.
계층적 프로젝트 구조가 없는 프로젝트와 라이브러리는 호환성을 유지합니다.
표준 라이브러리
Kotlin 1.4.20의 표준 라이브러리는 파일 작업에 대한 새로운 확장 기능과 더 나은 성능을 제공합니다.
- java.nio.file.Path에 대한 확장 기능
- 개선된 String.replace 함수 성능
java.nio.file.Path에 대한 확장 기능
java.nio.file.Path에 대한 확장 기능은 실험적입니다. 언제든지 폐기되거나 변경될 수 있습니다. 옵트인(opt-in)이 필요합니다 (아래의 세부 내용 참조). 평가 목적으로만 사용하세요. YouTrack에서의 피드백을 환영합니다.
이제 표준 라이브러리에서는 java.nio.file.Path에 대한 실험적인 확장 기능을 제공합니다. 최신 JVM 파일 API를 Kotlin 스타일로 사용하는 것은 이제 kotlin.io 패키지의 java.io.File 확장 기능을 사용하는 것과 유사합니다.
// div (/) 연산자를 사용하여 경로 생성
val baseDir = Path("/base")
val subDir = baseDir / "subdirectory"
// 디렉토리에서 파일 목록 가져오기
val kotlinFiles: List<Path> = Path("/home/user").listDirectoryEntries("*.kt")
이 확장 기능은 kotlin-stdlib-jdk7 모듈의 kotlin.io.path 패키지에서 사용할 수 있습니다. 이 확장 기능을 사용하려면 실험적 어노테이션 @ExperimentalPathApi를 옵트인하세요.
개선된 String.replace 함수 성능
String.replace()의 새로운 구현은 함수 실행 속도를 향상시킵니다. 대소문자 구분 변형은 indexOf를 기반으로 한 수동 대체 루프를 사용하고, 대소문자 무시 변형은 정규 표현식 일치를 사용합니다.
kotlin 안드로이드 확장
1.4.20 버전에서는 Kotlin Android Extensions 플러그인이 폐기되며 Parcelable 구현 생성기가 별도의 플러그인으로 이동합니다.
- 합성 뷰의 폐기
- Parcelable 구현 생성기를 위한 새 플러그인
합성 뷰의 폐기
합성 뷰는 Kotlin Android Extensions 플러그인에서 UI 요소와의 상호 작용을 간단하게 하고 불필요한 코드를 줄이기 위해 일정 시간 전에 제공되었습니다. 이제 Google은 동일한 역할을 수행하는 Android Jetpack의 뷰 바인딩이라는 네이티브 메커니즘을 제공하고 있으며, 이에 따라 합성 뷰를 Android Jetpack의 뷰 바인딩을 선호하는 방향으로 폐기합니다.
우리는 Parcelable 구현 생성기를 kotlin-android-extensions에서 분리하고 나머지 부분인 합성 뷰에 대한 폐기 주기를 시작합니다. 현재로서는 경고와 함께 작동하지만 앞으로 프로젝트를 다른 솔루션으로 전환해야 할 것입니다. 아래는 합성 뷰에서 뷰 바인딩으로 Android 프로젝트를 마이그레이션하는 데 도움이 되는 지침입니다.
Parcelable 구현 생성기를 위한 새 플러그인
Parcelable 구현 생성기는 이제 새로운 kotlin-parcelize 플러그인에서 사용할 수 있습니다. kotlin-android-extensions 대신 이 플러그인을 적용하십시오.
하나의 모듈에서 kotlin-parcelize와 kotlin-android-extensions를 동시에 적용할 수 없습니다.
@Parcelize 어노테이션은 kotlinx.parcelize 패키지로 이동되었습니다.
Android 문서에서 Parcelable 구현 생성기에 대해 자세히 알아보세요.
원문
https://kotlinlang.org/docs/whatsnew1420.html#deprecation-of-synthetic-views
'Kotlin > What's new' 카테고리의 다른 글
[Kotlin 번역] What's new in Kotlin 1.5.0 (1) | 2023.09.16 |
---|---|
[Kotlin 번역] What's new in Kotlin 1.4.30 (42) | 2023.09.16 |
[Kotlin 번역] What's new in Kotlin 1.4.0 (3) | 2023.09.16 |
[Kotlin 번역] What's new in Kotlin 1.3 (114) | 2023.09.13 |
[Kotlin 번역] What's new in Kotlin 1.2 (28) | 2023.09.13 |
댓글