본문 바로가기
Kotlin

[Kotlin] 배열, 리스트 자르기

by Echung 2024. 1. 4.

thumbnail

안녕하세요. 이번에는 Kotlin에서 배열, 리스트를 자르는 코드에 대하여 알아보았습니다.

배열, 리스트 자르는 코드


배열과 리스트를 자르는 코드에는 slice, sliceArray, copyOfRange, subList 등이 있습니다. 이제 하나씩 알아보도록 하겠습니다.

Slice, SliceArray 란,


Slice는 파라미터로 리스트를 전달해 주고, 원본 list에서, 파라미터로 받은 list의 element와 같은 인덱스의 값으로 된 리스트를 반환합니다. 코드로 확인해 보겠습니다.

val list = mutableListOf(1, 2, 3, 4, 5)
println(list.slice(2..4)))  // [3, 4, 5]

val array = intArrayOf(1, 2, 3, 4, 5)
println(array.sliceArray(2..4).contentToString()) //[3, 4, 5]

slice는 지정된 범위만큼 잘라서 list로 반환하는 것을 확인할 수 있었습니다. 여기서 slice는 리스트를 반환하지만 sliceArray를 사용하면 배열을 자르고 배열로 반환할 수 있습니다. 

 

copyOfRange 란,


copyOfRange는 원래 배열의 지정된 범위의 복사한 후 새 벼열을 반환합니다. copyOfRange는 매개변수를 fromIndex - 복사할 범위(포함)의 시작, toIndex - 복사할 범위의 끝을 받습니다.

val arr = intArrayOf(1, 2, 3, 4, 5)
println(arr.copyOfRange(1, 3).contentToString())  // [2, 3]

여기서 주의할 점은 처음 매개변수는 범위에 포함되지만 2번째 매개변수는 범위에 포함되지 않습니다.

subList 란,


subList에 대해서 알아보겠습니다. 

사진 1. subList 설명

 

subList는 slice와 copyOfRange와 다르게 새 배열, 리스트를 반환해 주는 것이 아닌 지정된 범위를 보여주는 view입니다. 그래서 subList를 사용하면 위의 설명에서도 알 수 있듯이, 만약 list에 변화가 생기면 subList의 값에도 변환이 생긴다는 차이점이 있습니다.코드로 확인해 보겠습니다.

val list = mutableListOf(1, 2, 3, 4, 5)
val subList = list.subList(1, 3) // [2, 3]

println(subList) // [2, 3]
list[2] = 5
println(subList) // [2, 5]

이렇게 subList는 중간에 list가 변화면서 값이 변화는 것을 확인할 수 있었습니다. 

slice와 subList 차이점?


slice와 subList의 차이점은 무엇일까? slice는 리스트를 원하는 범위만큼 자르고 새 리스트를 보여줍니다. 하지만, subList는 list의 값을 보여주는 view이므로 중간에 list가 변화게되면 subList의 값도 변화합니다. 코드로 확인해 보겠습니다.

val list = mutableListOf(1, 2, 3, 4, 5)
val slice = list.slice(1..2) // [2, 3]
val subList = list.subList(1, 3) // [2, 3]

println(subList) // [2, 3]
println(slice) // [2, 3]
list[2] = 5
println(subList) // [2, 5]
println(slice) // [2, 3]

위의 코드를 보게 되면 slice를 하면 중간에 list값이 변경되어도 그대로 출력되는 것을 확인할 수 있습니다. subList는 중간에 값이 변경되면 변경된 값을 보여주는 것을 확인할 수 있습니다.

마치며,


slice와 subList를 사용하면 배열과 리스트를 쉽게 자르고 결과를 보여줄 수 있지만, 상황에 따라서 사용해야 사용자에게 원치 않는 결과를 보여주는 문제가 발생할 수 있습니다. slicesubList를 주의하면서 사용해야겠습니다. sliceArray와 copyOfRange는 둘 다 원본 배열은 변경되지 않고 새로운 배열을 보여준다는 점에서 같아서 둘은 사용하기 편한 것을 사용해도 될 것 같습니다.

Reference


https://gold.gitbook.io/kotlin/collections/filtering-operations/slice

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/copy-of-range.html

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-list/sub-list.html

반응형