본문 바로가기
프로그래밍/kotlin

[kotlin] kotlin 1.4.0 RELEASE 정리

by 사바라다 2021. 11. 11.

안녕하세요. 오늘은 kotlin 1.4.0 버전 RELEASE에 업데이트 된 내용을 한번 살펴보도록하겠습니다.

kotlin 1.4.0

코틀린 1.4.0은 성능과 품질에 집중했다고 합니다. 어떤 점이 변경되었는지 아래에서 바로 알아보겠습니다. kotlin/JVM 기준으로 알아두면 좋을것 같은 것들만 발췌하였습니다.

코틀린 Interface SAM(Single Abstract Method)

Java8부터 Interface에 1개의 메서드만 가지게 되면 이를 함수형 인터페이스(Functional Interface)라고 부르며 람다(lambda)식으로 사용할 수 있게됩니다. 이를 SAM(Single Abstract Method)라고도 부릅니다. 대표적으로 Function이라는 인터페이스가 있습니다.

@FunctionalInterface
public interface Function<T, R> {
    R apply(T t);
}

1.4 버전 이전까지 코틀린에서는 이러한 SAM을 지원하고 있지 않았습니다. 따라서 SAM은 java 코드를 이용해서 작성해야했는데요. 1.4 버전으로 올라오면서 이를 사용할 수 있게되었습니다. 사용방법은 interfce앞에 fun keyword를 붙여 사용합니다. 아래는 공식문서에 나오는 예제입니다.

fun interface IntPredicate {
    fun accept(i: Int): Boolean
}

val isEven = IntPredicate { it % 2 == 0 }

fun main() { 
    println("Is 7 even? - ${isEven.accept(7)}")
}

named와 positional arguments 병합 사용

코틀린 1.3까지는 named arguments 뒤에는 positional arguments가 올 수 없었습니다. 하지만 1.4 버전 이상부터는 이게 가능하게됩니다.

fun foo(first: String, second: String) {
    ...
}
// 1.3
foo("first", second = "second") // 성공
foo(first = "first", "second") // 실패
// 1.4
foo("first", second = "second") // 성공
foo(first = "first", "second") // 성공

트레일링 컴마(Trailing comma)

코틀린 1.4 버전 이상부터는 마지막 아규먼트, 마지막 파라미터, when 구문의 마지막 등에 ,를 붙일 수 있게됩니다. 이것을 Trailling Comma라고 합니다. 아래 코드는 Trailing comma를 적용한 코드입니다.

val colors = listOf(
    "red",
    "green",
    "blue", //trailing comma
)

코드를 이렇게 작성했을 때 2가지의 장점을 생각할 수 있습니다. 첫번째는 파라미터의 순서가 바뀌었을 때 아규먼트또한 ,에 상관없이 파라미터에 맞춰 순서만 바꿔주기만 하면됩니다. 2번째는 git의 코드 diff에서 ,가 있고 없고에 따라서 수정이 일어나면 그 라인 전체가 잡히게되는데 이게 ,는 고정으로 있게되므로 실제로 수정된 부분만 diff처리가 가능해집니다.

loop 안에서 when 구문을 사용하며 break, continue를 사용할 수 있다

코틀린 1.3 에서 LOOP 안에 when 구문을 사용할때, 그리고 그 안에서 break와 continue를 사용할 수 있습니다. 그런데 이게 바로 사용할 수 있는게 아니라 라벨(label)을 이용해야합니다. 아래 코드가 1.3 버전에서의 코드입니다. for 문에 LOOP라고하는 라벨이 붙여져있습니다. 그리고 when 구문안의 continue와 break syntax에 @LOOP를 사용해야 for 문을 기준으로 정상동작을 하게 됩니다.

fun test(xs: List<Int>) {
    LOOP@for (x in xs) {
        when (x) {
            2 -> continue@LOOP
            17 -> break@LOOP
            else -> println(x)
        }
    }
}

코틀린 1.4 부터는 for 구문안에 when 구문이 포함될 때 이런 label을 사용하지 않아도 되게 됩니다. 아래코드를 보시면 LOOP 와 같은 라벨 이 없기 때문에 훨씬 깔끔하고 자연스러운 코드가 작성가능한 것을 확인하실 수 있습니다.

fun test(xs: List<Int>) {
    for (x in xs) {
        when (x) {
            2 -> continue
            17 -> break
            else -> println(x)
        }
    }
}

코루틴 디버거(Coroutine Debugger)

코틀린은 1.3 버전부터 비동기 프로그래밍을 언어차원에서 코루틴을 지원해주고 있습니다. 하지만 디버깅에는 좀 미흡한 점이 많았습니다. 코루틴은 thread를 넘나들며 실행되기 때문에 안의 context를 정확하게 디버깅하지 못했습니다. 하지만 1.4 버전 부터는 코루틴을 제대로 디버깅할 수 있게 되었습니다. 관련된 내용은 Link를 참조하세요.

type 추론 강화

코틀린 1.4 버전에서 강해진 타입 추론에 대해서 알아봅시다.

  • nullable String인 String?를 추론할 수 있게 되었습니다.
  • scope function 에서 nullable 변수를 받고 이후 null check를 하고 값을 대입, 그리고 값을 반환하면 not null value로 반환됩니다.
val result = run {
    var str = currentValue()
    if (str == null) {
        str = "test"
    }
    str // 코틀린 컴파일러는 str이 not null 이라는 사실을 압니다.
}o
// 코틀린 1.3에서는 String?, 코틀린 1.4에서는 String 타입으로 반환됨
  • 1.4 버전 부터는 코틀린 리플렉션 중 하나인 KFucntion 또한 스마트 캐스트가 가능합니다.
  • delegated propertiesString? 타입 추론이 추가되었습니다.

interface default method 생성하는 방법

코틀린 1.3 버전에서 interface default method를 생성하기위해서 @JvmDefault 어노테이션과 -Xjvm-default을 사용했었습니다. 하지만 1.4 버전으로 올라오면서 -Xjvm-default=all라는 새로운 옵션이 생겼습니다. 해당 옵션은 interface의 abstract method가 아닌 함수에 대해서 default 메서드로 만들어주는 옵션입니다.

null checks 예외 통합

코틀린 1.4.0 버전부터 모든 null checks 예외는 KotlinNullPointerException, IllegalStateException, IllegalArgumentException, 그리고 TypeCastException 대신에 java.lang.NullPointerException를 throw하게 됩니다.

마무리

오늘은 이렇게 kotlin 1.4.0 RELEASE docs 중 알아두면 좋을것 같은 부분을 번역 및 확인해보는 시간을 가져보았습니다.

감사합니다.

참고

kotlinlang_migrating-to-kotlin-1-4-0

댓글