Primary/Kotlin

Kotlin 2.0.0 출시

해스끼 2024. 6. 8. 14:44

Kotlin K2 컴파일러가 드디어 stable 출시되었다! 주요 변경점들을 하나씩 알아보자.

Kotlin 2.0.0 변경점

그 외의 변경점 중 재밌어 보이는 것들을 정리해 보았다.

 

What's new in Kotlin 2.0.0 | Kotlin

 

kotlinlang.org

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

자세한 정보는 이 글에서 확인할 수 있다.

 

Power-assert compiler plugin | Kotlin

 

kotlinlang.org

Android에 Kotlin 2.0.0 적용하기

는 이 글을 참고하면 좋다. 쿠링 팀원분께서 작성하신 글이다. 👍👍

 

Kotlin 2.0으로 마이그레이션하기

Kotlin 2.0 마이그레이션 가보자고 🚀

medium.com

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