내일부터 본격적으로 코틀린 학습을 앞두고 공부해두었던 내용들을 복습하는 시간을 가졌다. 그러다가 생긴 의문에 대해 간단히 정리해보았다.
1. filter()와 filterNotNull()
이전에 컬렉션을 필터링하는 방법들에 대해 정리하면서는 별다른 생각을 하지 못했지만 지금 복습하며 생각해보니 이상하다는 생각이 들었다.
filter()로 null이 아닌 것들을 걸려내면 될텐데 굳이 filterNotNull()이라는 함수가 있는 이유가 궁금했다.
결론부터 말하면 filter()로 null이 아닌 것들을 걸러낸것과 filterNotNull()을 이용해 null이 아닌 것들을 걸러낸 것은 결과가 다르다.
둘다 null이 걸러지는 것은 같지만 filter()로 거르게 되면 반환 값들이 null을 허용하는 값들로 반환되고, filterNotNull()을 이용해 거르게 되면 반환 값들이 null을 허용하지 않는 값들로 반환이 된다.
코드를 작성해서 직접 확인해보면 이해가 쉽다.
fun main() {
fun nullOrString(a:String) = if(a.length>3) a else null
val names = arrayOf("Max", "Bob", "Paul", "Jake", "Emma", "Elizabeth")
val filterNames = names.map { nullOrString(it) }.filter { it != null }
val filterNotNullNames = names.map { nullOrString(it) }.filterNotNull()
// 출력해보면 둘의 값은 동일하다
println(filterNames) // [Paul, Jake, Emma, Elizabeth]
println(filterNotNullNames) // [Paul, Jake, Emma, Elizabeth]
// filter를 이용하니 nullable한 문자열이 반환되었다.
// 따라서 일부 함수와 속성의 경우 safe call이나 !!연산자를 사용해야지만 사용할 수 있다.
println(filterNames[0]?.uppercase()) // PAUL
println(filterNames[1]!!.length) // 4
// filterNotNull을 이용하니 결과가 non-nullable한 문자열이 반환되었다.
println(filterNotNullNames[0].uppercase()) // PAUL
println(filterNotNullNames[1].length) // 4
}
위와 같이 filter()를 이용했더니 반환된 요소가 String? 타입이었고, filterNotNull()을 이용했더니 반환된 요소가 String타입이 되는 것을 확인할 수 있었다.
null을 걸러내고 모든 요소들을 null을 허용하지 않는 타입으로 변환시키고 싶다면 filterNotNull()을 써서 한 번에 처리하는 것이 편할 것이다. filter()를 사용한다면 다시 한 번 처리를 해줘야하기 때문이다.
의문이 드는 내용들을 실제 코드로 작성해보고 확인해보니 의문이 어느 정도 해소되었다. 나중에 사용할 일이 있다면 한 번 정리해둔 내용이 있기 때문에 큰 도움이 될 것 같다.
2. 오늘 배운 것
- 코틀린 기본 문법들을 복습해보았다.
- 의문이 드는 부분에 대해 찾아보고 직접 확인한 것을 정리해보았다.
'오늘 배운 것' 카테고리의 다른 글
24-04-23 Kotlin 간단한 텍스트 rpg 만들어보기 (2) (0) | 2024.04.23 |
---|---|
24-04-22 Kotlin 간단한 텍스트 rpg 만들어보기 (2) | 2024.04.22 |
24-04-20 Kotlin 컬렉션 정렬하기 (2) (0) | 2024.04.20 |
24-04-19 프로젝트 회고 (0) | 2024.04.19 |
24-04-18 소개 페이지 오류 수정하기 (0) | 2024.04.18 |