안녕하세요. 오늘은 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 properties에
String?
타입 추론이 추가되었습니다.
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 중 알아두면 좋을것 같은 부분을 번역 및 확인해보는 시간을 가져보았습니다.
감사합니다.
참고
'language, framework, library > kotlin' 카테고리의 다른 글
[kotlin] 코틀린 차곡차곡 - 16. kotlin JVM annotation 알아보기 2편 (2) | 2022.01.26 |
---|---|
[kotlin] 코틀린 차곡차곡 - 15. kotlin JVM annotation 알아보기 (0) | 2022.01.22 |
[kotlin] 1.3 버전 RELEASE 정리 (0) | 2021.11.07 |
[kotlin] 코틀린 차곡차곡 - 14. 중위 표기법 함수 (infix notation function) (0) | 2021.10.23 |
[kotlin] 코틀린 차곡차곡 - 13. data class (1) | 2021.10.05 |
댓글