일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Rxjava
- android
- Kotlin
- livedata
- pandas
- MiTweet
- Gradle
- GitHub
- 코드포스
- 코루틴
- Compose
- androidStudio
- relay
- 쿠링
- Coroutine
- boj
- architecture
- Codeforces
- Hilt
- activity
- Python
- TEST
- 프로그래머스
- 암호학
- textfield
- 백준
- MyVoca
- ProGuard
- Coroutines
- AWS
- Today
- Total
이동식 저장소
Kotlin 2.0.0 출시 본문
Kotlin K2 컴파일러가 드디어 stable 출시되었다! 주요 변경점들을 하나씩 알아보자.
Kotlin 2.0.0 변경점
그 외의 변경점 중 재밌어 보이는 것들을 정리해 보았다.
Smart cast 확대
Smart cast는 비교문 등에 의해 변수가 자동으로 형변환되는 것을 말한다. 예를 들어 if 조건문에서 어떤 변수가 null이 아니라는 것을 확인했다면, if문 안에서는 해당 변수가 non-null로 간주된다.
Kotlin 2.0에서는 이것이 확대되어, 컴파일러가 비교문을 통해 변수의 타입을 자동으로 추출하는 등 고급 smart cast 기능을 제공한다.
class Cat {
fun purr() {
println("Purr purr")
}
}
fun petAnimal(animal: Any) {
val isCat = animal is Cat
if (isCat) {
// animal이 자동으로 Cat 타입으로 인식됨
// 2.0 이전에는 Any 타입으로 인식되었음
animal.purr()
}
}
Kotlin Power-assert 플러그인
Kotlin 2.0에 Power-assert 플러그인이 추가되었다. 아직 experimental 단계이긴 하지만, 테스트 메시지에 더 자세한 정보를 보여주는 플러그인이라고 한다. 특히 테스트가 실패했을 때 assert에 사용된 중간 값들을 더 자세히 보여줌으로서 테스트가 실패한 이유를 빠르게 이해할 수 있도록 돕는다.
다음과 같은 테스트 코드가 있다고 하자.
@Test
fun testFunction() {
val hello = "Hello"
val world = "world!"
assert(hello.length == world.substring(1, 4).length) { "Incorrect length" }
}
Power-assert 플러그인을 활성화한 후 테스트를 돌리면, 다음과 같은 에러 메시지가 출력된다.
Incorrect length
assert(hello.length == world.substring(1, 4).length) { "Incorrect length" }
| | | | | |
| | | | | 3
| | | | orl
| | | world!
| | false
| 5
Hello
이건 좀 많이 좋은데?
주의할 점은, Assert 구문 내의 변수를 별도로 선언하면 몇몇 정보가 보이지 않을 수 있다.
@Test
fun testComplexAssertion() {
val person = Person("Alice", 10)
val isValidName = person.name.startsWith("A") && person.name.length > 3
val isValidAge = person.age in 21..28
assert(isValidName && isValidAge)
}
Assertion failed
assert(isValidName && isValidAge)
| |
| false
true
확인하고자 하는 값을 assert문에 직접 작성해야 더 자세한 메시지를 볼 수 있다.
@Test
fun testComplexAssertion() {
val person = Person("Alice", 10)
assert(person.name.startsWith("A") && person.name.length > 3 && person.age > 20 && person.age < 29)
}
Assertion failed
assert(person.name.startsWith("A") && person.name.length > 3 && person.age > 20 && person.age < 29)
| | | | | | | | | |
| | | | | | | | | false
| | | | | | | | 10
| | | | | | | Person(name=Alice, age=10)
| | | | | | true
| | | | | 5
| | | | Alice
| | | Person(name=Alice, age=10)
| | true
| Alice
Person(name=Alice, age=10)
``assert`` 함수 외에도 ``require()``, ``assertTrue()`` 등 마지막 매개변수가 ``String`` 또는 ``() -> String`` 타입인 모든 함수에 적용될 수 있다.
@Test
fun testRequireFunction() {
val value = ""
require(value.isNotEmpty()) { "Value should not be empty" }
}
Value should not be empty
require(value.isNotEmpty()) { "Value should not be empty" }
| |
| false
자세한 정보는 이 글에서 확인할 수 있다.
Android에 Kotlin 2.0.0 적용하기
는 이 글을 참고하면 좋다. 쿠링 팀원분께서 작성하신 글이다. 👍👍
Compose 컴파일러 버전 통일
안드로이드 개발자로서 가장 크게 느껴지는 변경점은, Compose 컴파일러가 Kotlin 컴파일러에 통합됐다는 점. 이전까지는 Compose 컴파일러와 Kotlin 버전이 서로 달랐고, 호환되는 Kotlin 버전 외에는 사용할 수 없어서 두 버전을 반드시 동일하게 맞춰야 하는 귀찮음이 있었다.
그러나 이제는 ``Kotlin 버전 = Compose 컴파일러 버전``이므로 귀찮게 버전을 맞추지 않아도 된다.
실제 적용
블린더에 Kotlin 2.0.0을 적용하고, 1.9.23 버전과의 컴파일 속도 차이를 비교해 보았다.
- 1.9.23: 146초
- 2.0.0: 140초
- 2.0.0(kapt에 2.0 적용): 75초
kapt가 Kotlin 2.0을 사용하도록 수정했더니 빌드 속도가 거의 반토막났다. 좋은데?
다들 2.0 한번 잡숴보시길 바란다. try try
'Primary > Kotlin' 카테고리의 다른 글
Sealed class vs. enum class (0) | 2024.06.14 |
---|---|
kapt를 KSP로 migrate하기 (0) | 2024.06.08 |
mutableMapOf()의 내부 구현 (0) | 2024.02.03 |
[Kotlin] Coroutines Job (0) | 2022.11.10 |
[Kotlin] Dispatcher (0) | 2022.11.08 |