컬렉션(Collection)은 개발자가 서로 관련된 다양한 객체들을 한곳에 모아 그룹으로 관리할 수 있는 객체입니다. Kotlin 표준 라이브러리에는 List, Array 등 다양한 종류의 컬렉션이 제공됩니다.
이 글에서는 컬렉션 내부에 존재하는 여러 속성(필드)을 기준으로 컬렉션을 정렬하는 방법을 살펴보겠습니다. 이를 위해 Kotlin 라이브러리에서 제공하는 다음 두 가지 함수를 활용합니다.
- sortedWith()
- compareBy()
sortedWith() 함수란?
sortedWith()는 지정된 Comparator(비교자)를 기준으로 모든 요소를 정렬한 새로운 리스트를 반환하는 함수입니다. 공식 Kotlin 문서에 따르면 함수 시그니처는 다음과 같습니다.
fun <T> Array<out T>.sortedWith( comparator: Comparator<in T> ): List<T>
sortedWith()는 Comparator를 인자로 받아 각 객체의 사용자 지정 속성을 비교한 뒤, 그 결과에 따라 요소들을 정렬합니다.
compareBy() 함수란?
compareBy()는 sortedWith()에 전달할 Comparator를 생성하는 역할을 합니다. 하나 이상의 선택자(selector)를 인자로 받아, 나열된 순서대로 속성을 우선순위에 따라 비교합니다. Kotlin 문서에 따른 함수 정의는 다음과 같습니다.
fun <T> compareBy( vararg selectors: (T) -> Comparable<*>? ): Comparator<T>
예제
다음 예제에서는 학생 이름, 나이, GPA를 담는 Student 클래스를 만들어 보겠습니다. 목표는 "나이" 또는 "GPA" 중 하나만이 아니라, 두 필드를 조합하여 전체를 정렬하는 것입니다.
fun main()
{
val studentA = Student("Student A", 18, 7.0)
val studentB = Student("Student B", 18, 6.9)
val studentC = Student("Student C", 20, 7.3)
val studentD = Student("Student D", 22, 8.3)
val studentsList = listOf(
studentA,
studentB,
studentC,
studentD
)
val sortedList = studentsList.sortedWith(
compareBy(
{ it.age },
{ it.GPA }
)
)
sortedList.forEach {
println("name: ${it.name}, age: ${it.age}, GPA: ${it.GPA}")
}
}
class Student(val name: String, val age: Int, val GPA: Double)위 코드에서 compareBy({ it.age }, { it.GPA })는 먼저 나이(age)를 오름차순으로 비교하고, 나이가 같은 경우 GPA를 기준으로 추가 정렬을 수행합니다. 즉, 첫 번째 선택자가 우선순위를 가지며, 값이 동일할 때 다음 선택자가 적용되는 방식입니다.
실행 결과
코드를 실행하면 다음과 같은 출력이 생성됩니다.
name: Student B, age: 18, GPA: 6.9 name: Student A, age: 18, GPA: 7.0 name: Student C, age: 20, GPA: 7.3 name: Student D, age: 22, GPA: 8.3
결과를 보면 나이가 18인 학생 두 명(Student A, Student B)은 GPA 순으로 정렬되고, 이후 나이 순서대로 전체 리스트가 정렬된 것을 확인할 수 있습니다. 이처럼 sortedWith()와 compareBy()를 조합하면 복잡한 다중 조건 정렬도 간결하고 가독성 있게 구현할 수 있습니다.