Kotlin을 하다 보면 if를 이용하여
배열에 null이 있지는 않은지, 또한
조건에 맞는 원소가 있는지 등 for문과 if를 를 이용하여 확인하는 일들이 종종 있습니다.
하지만 코틀린의 장점은 이러한 부분들을 지원해 준다는 것입니다.
그중 코틀린 Collection에서 사용할 수 있는 filter에 대해 알아보겠습니다.
간단한 예제와 함께 살펴보시죠
val foodList = listOf("Hamburger", "Pizza", null, "Sandwich", "Chicken", "Pasta", null)
음식들의 이름이 들어있는 리스트를 선언해주었습니다.
하지만 해당 리스트에는 null들이 들어있습니다.
여기서 원래는 반복문을 이용하여 null이 아닌 것을 찾아줘야 됐지만,
filter를 이용한다면 이런 식으로
println(foodList.filter { it != null })
이런식으로 null을 쉽게 제거할 수 있다는 것을 알 수 있습니다.
여기서 눈치가 조금 빠르신 분들을 눈치채셨겠지만
해당 코드를 본다면 filter문을 println()으로 감싸고 있습니다.
filter는 {} 안에 조건문을 충족하는 값들을 list형태로 return 해줍니다.
함수의 흐름
따라서 해당 함수는
filter를 돌며 조건에 맞는
즉, 조건에 참이 되는 원소들을 list형태로 반환
반환된 값을 출력하는 순서로 이루어져 있습니다.
하지만 intellij에서는 해당 코드에 노란 줄을 그어줍니다.
그 이유를 확인해 보면 kotlin에서는 자주 사용하는 것들을 편리하게 함수로 만들어줍니다.
filter를 이용하여 null이 아닌 것을 골라내는 것을 이미 예상했다는 듯이
filterNotNull()이라는 함수가 이미 있기 때문에 수정을 제안하는 것이었습니다.
따라서 아래처럼 코드를 변경해 준다면 노란 줄이 사라지는 것을 알 수 있습니다.
filter 다양하게 사용하기
String 형태의 요소를 가진 List가 filter에 들어간다면 어떤 기능을 제공해 줄까요?
filter에는 조건문이 들어가기 때문에
일반 조건문에서 사용할 수 있는 것을들 사용할 수 있습니다.
fun main() {
val foodList = listOf("Hamburger", "Pizza", "Sandwich", "Chicken", "Pasta")
println(foodList.filter { it.startsWith("P") })
}
코드에서 it.startWith("P")를 사용하였고, 요소가 P로 시작하는가?라는 조건이 생겼습니다.
그러면 조건이 참이 되게 하는 Pizza와 Pasta가 출력이 되는 모습을 볼 수 있습니다.
일반 filter에 대해선 어느 정도 감이 온듯하니 비슷하게 많이 사용하는 다른 필터도 몇 개만 알아보겠습니다.
filterNot
fun main() {
val foodList = listOf("Hamburger", "Pizza", "Sandwich", "Chicken", "Pasta")
println(foodList.filterNot { it == "Sandwich" })
}
해당 코드를 보신다면 이번에는 filter가 아니라 filterNot이라는 것을 사용하였습니다.
코드를 출력해 본다면 이처럼 조건에 만족하지 않는 요소들을 리스트로 반환한다는 것을 알 수 있습니다.
filterIndexed
fun main() {
val foodList = listOf("Hamburger", "Pizza", "Sandwich", "Chicken", "Pasta")
println(foodList.filterIndexed { index, it -> index == 3 })
}
이번에는 filterIndexed를 사용하여 요소에 대한 직접적인 조건이 아닌
인덱스를 조건에 넣어서도 사용할 수 있다는 것을 알 수 있습니다.
결과는 3번째 인덱스에 있는 Chicken이 잘 출력되는 것을 볼 수 있습니다.
마무리
이 밖에도 코틀린에는 Collection에 지원하는 함수들이 굉장히 많습니다.
이는 프로그래밍을 간편하게 할 수 있도록 도움을 주는 매우 편리한 함수들이기에
사용하다 보면 굉장히 프로그래밍을 편리하게 도움을 줍니다.
하지만 결국에는 리스트 전체를 도는 것이기 때문에 너무 많은 사용은 자제해야 합니다.
'Kotlin' 카테고리의 다른 글
Kotlin에서 더블 콜론(::)은 무엇일까 (0) | 2023.02.07 |
---|---|
[Kotlin] - map함수 (리스트 값 변경하기) (0) | 2023.02.02 |
[Kotlin] lateinit, by lazy (0) | 2023.01.27 |
특정 키워드 변수명 마음대로 선언하기 (0) | 2023.01.25 |
매개변수의 개수가 고정되지 않은 함수 사용하기 - [Doit! 코틀린 프로그래밍] (0) | 2023.01.25 |