면접 질문실전 질문꼬리 질문

코틀린 컬렉션 확장 함수를 활용한 데이터 추출

skydovesJaewoong Eum (skydoves)||8분 소요

코틀린 컬렉션 확장 함수를 활용한 데이터 추출

Kotlin은 컬렉션에서 특정 부분 집합이나 원하는 요소를 추출하기 위한 다양한 확장 함수(extension function)를 제공합니다. 이 함수들은 원본 컬렉션을 변경하지 않으면서도 효율적으로 데이터를 꺼내올 수 있도록 설계되어 있습니다. 각 상황에 맞는 함수를 정확히 선택하면 불필요한 복사를 방지할 수 있고, 데이터 처리 코드의 가독성도 높일 수 있습니다. 실무에서 컬렉션을 다루는 일은 매우 빈번하기 때문에, 면접에서도 이와 관련된 질문이 자주 출제됩니다. 이번 면접 질문을 통하여 아래 내용들을 학습하실 수 있습니다.

  • slice, take, takeLast, drop, dropLast를 활용한 위치 기반 요소 추출
  • chunked를 사용하여 컬렉션을 고정 크기 그룹으로 분할하는 방법
  • windowed를 활용한 겹침(overlapping) 또는 슬라이딩 부분 집합 생성
  • zipWithNext를 이용한 인접 요소 쌍 연산
  • 위치 기반, 그룹 기반, 슬라이딩 접근 등 상황에 따라 적합한 함수를 선택하는 기준
  • 대규모 컬렉션에서 추출 연산을 체이닝할 때 고려해야 할 성능 특성

slice

slice 함수는 범위(Range) 또는 인덱스 리스트를 사용하여 컬렉션에서 원하는 요소를 추출합니다. 지정된 위치의 요소들로 구성된 새로운 리스트를 생성하여 반환합니다.

val items = listOf("skydoves", "kotlin", "developer", "android")
val sliced = items.slice(1..2)
println(sliced) // 출력: [kotlin, developer]

특정 인덱스를 개별적으로 지정하여 연속되지 않은 요소를 추출하는 것도 가능합니다. items.slice(listOf(0, 3))[skydoves, android]를 반환합니다. 이 덕분에 slice는 비연속적인 접근 패턴에서 subList보다 훨씬 유연하게 활용할 수 있습니다.

take와 takeLast

take(n)은 컬렉션의 앞에서부터 n개의 요소를 반환하고, takeLast(n)뒤에서부터 n개의 요소를 반환합니다.

val names = listOf("skydoves", "kotlin", "developer")
println(names.take(2))      // [skydoves, kotlin]
println(names.takeLast(2))  // [kotlin, developer]

n이 컬렉션 크기를 초과하더라도 예외가 발생하지 않고 전체 컬렉션을 그대로 반환합니다. 이러한 안전한 동작 방식 덕분에 별도의 범위 검사를 수동으로 수행할 필요가 없습니다. 또한 조건부 변형 함수인 takeWhiletakeLastWhile도 제공되며, 주어진 조건(predicate)이 참인 동안 요소를 계속 가져옵니다.

drop과 dropLast

drop(n)은 앞에서부터 n개의 요소를 건너뛰고 나머지를 반환하며, dropLast(n)은 뒤에서부터 n개의 요소를 건너뛰고 나머지를 반환합니다.

val numbers = listOf(1, 2, 3, 4, 5)
println(numbers.drop(2))      // [3, 4, 5]
println(numbers.dropLast(2))  // [1, 2, 3]

take와 마찬가지로 조건부 변형 함수가 존재합니다. dropWhiledropLastWhile은 주어진 조건이 충족되는 동안 요소를 건너뜁니다. 가령, 리스트 앞부분에 있는 공백 항목을 제거하는 것처럼 특정 조건에 해당하는 선행 또는 후행 요소를 잘라낼 때 유용합니다.

chunked

chunked(n) 함수는 컬렉션을 크기 n의 리스트들로 분할합니다. 컬렉션 크기가 n으로 나누어떨어지지 않으면, 마지막 청크(chunk)에는 남은 요소만 포함됩니다.

이 면접 질문은 구독자 전용입니다

Dove Letter를 구독하시면 안드로이드, 코틀린 개발 관련 독점 면접 질문의 전체 내용을 볼 수 있습니다.

구독하기