•
Kotlin 표준 라이브러리는 컬렉션에 대한 다양한 작업을 수행할 수 있는 많은 함수를 제공한다.
•
여기에는 요소를 가져오거나 추가하는 간단한 작업뿐만 아니라 검색, 정렬, 필터링, 변환 등의 복잡한 작업도 포함된다.
확장 함수와 멤버 함수
•
컬렉션 작업은 표준 라이브러리에 두 가지 방식(컬렉션 인터페이스의 멤버 함수와 확장 함수)으로 선언된다.
◦
멤버 함수
▪
컬렉션 타입에 필수적인 작업을 정의한다.
▪
예를 들어, Collection 에는 컬렉션이 비었는지 확인하는 isEmpty() 함수가 있고 List 에는 요소에 인덱스로 접근하는 get() 함수가 있다.
▪
자체 컬렉션 인터페이스 구현을 만들 때는 멤버 함수를 구현해야 한다.
▪
새로운 구현을 쉽게 만들기 위해 표준 라이브러리에서 AbstractCollection, AbstractList, AbstractSet, AbstractMap 과 같은 컬렉션 인터페이스의 스켈레톤 구현을 사용할 수 있다.
◦
확장 함수
▪
필터링, 변환, 정렬, 기타 컬렉션 처리 함수로 선언된다.
공통 작업
•
공통 작업은 읽기 전용 컬렉션과 변경 가능한 컬렉션 모두에서 사용할 수 있다.
•
공통 작업은 다음과 같은 그룹으로 나뉜다.
◦
변환
◦
필터링
◦
plus와 minus 연산자
◦
그룹화
◦
컬렉션 부분 가져오기
◦
단일 요소 가져오기
◦
정렬
◦
집계 작업
•
이러한 작업들은 원본 컬렉션에 영향을 미치지 않고 결과를 반환한다.
val numbers = listOf("one", "two", "three", "four")
numbers.filter { it.length > 3 } // `numbers`는 변경되지 않고 결과는 사라짐
println("numbers are still $numbers")
val longerThan3 = numbers.filter { it.length > 3 } // 결과를 `longerThan3`에 저장
println("numbers longer than 3 chars are $longerThan3")
Kotlin
복사
•
예를 들어, 필터링 작업은 필터링 조건에 맞는 요소를 포함하는 새로운 컬렉션을 생성한다.
•
이러한 작업의 결과는 변수에 저장하거나 다른 함수에 전달하는 방식으로 사용해야 한다.
val numbers = listOf("one", "two", "three", "four")
val filterResults = mutableListOf<String>() // 대상 객체
numbers.filterTo(filterResults) { it.length > 3 }
numbers.filterIndexedTo(filterResults) { index, _ -> index == 0 }
println(filterResults) // 두 작업의 결과를 포함함
Kotlin
복사
•
특정 컬렉션 작업에서는 결과를 반환하는 대신 결과 항목을 추가할 대상 객체를 지정할 수 있다.
•
대상은 함수가 새로운 객체 대신 결과 항목을 추가하는 변경 가능한 컬렉션이다.
•
이러한 작업을 수행하기 위해 filterTo() 나 associateTo() 와 같이 To 접미사가 있는 별도의 함수가 제공된다.
•
이 함수들은 대상 컬렉션을 추가적인 매개변수로 받는다.
// 결과를 새 해시 셋으로 필터링하여 중복 제거
val result = numbers.mapTo(HashSet()) { it.length }
println("distinct item lengths are $result")
Kotlin
복사
•
이러한 함수들은 편의를 위해 대상 컬렉션을 다시 반환하므로 함수 호출의 인자로 바로 생성할 수 있습니다.
•
대상 컬렉션을 사용하는 함수는 filter, associate, groupBy, flatMap 등의 작업에서 사용할 수 있습니다.
쓰기 작업
•
변경 가능한 컬렉션의 경우 컬렉션 상태를 변경하는 쓰기 작업도 있다.
•
이러한 작업에는 요소 추가, 제거 및 업데이트가 포함된다.
val numbers = mutableListOf("one", "two", "three", "four")
val sortedNumbers = numbers.sorted()
println(numbers == sortedNumbers) // false
numbers.sort()
println(numbers == sortedNumbers) // true
Kotlin
복사
•
일부 작업에 대해서는 동일한 작업을 수행하는 함수 쌍이 있다.
•
하나는 컬렉션을 직접 변경하고 다른 하나는 결과를 별도의 컬렉션으로 반환한다.
•
예를 들어, sort() 는 변경 가능한 컬렉션을 직접 정렬하여 상태를 변경하지만 sorted() 는 동일한 요소를 정렬된 순서로 포함하는 새로운 컬렉션을 만든다.