개발을 하다 보면 정렬을 해야하는 경우가 굉장히 많이 나타난다. 그럴 때 Dart나 다른 언어에서는 sort함수를 제공해주는데, 편리하게 사용할 수 있다 보니 sort함수에 대해 깊게 생각해 본 적이 없어 sort함수의 동작에 대해 알아보고자 한다.
우선, Dart의 sort함수는 Dart 내부적으로 Sort라는 객체를 사용해 지원하는데, Sort객체 속 sort를 보면 아래와 같은 설명이 적혀있다.
Sorts all elements of the given list [:a:] according to the given [:compare:] function.
The [:compare:] function takes two arguments [:x:] and [:y:] and returns -1 if [:x < y:], 0 if [:x == y:], and 1 if [:x > y:].
The function's behavior must be consistent. It must not return different results for the same values.
한국어로 해석하자면
compare
에 정의된 함수에 따라, 주어진 리스트 a의 모든 요소를 정렬합니다.
compare
함수는x
,y
라는 두 개의 매개변수를 가지며, 이를 통해 x < y인 경우 -1, x == y인 경우 0, x > y인 경우 1을 반환합니다.
이 함수의 동작은 반드시 일관되며 같은 값에 대해 다른 결과를 반환하지 않습니다.
하지만 이 문서를 읽어도 알 수 없는 내용이 두 가지 있다.
첫째로 x, y중 어떤 값이 index가 앞에 있는 값인지에 대한 것이다. 이 부분에 대해서는 결론적으로, x가 더 앞에 있는 값이다.
둘째로, -1, 0, 1이 각각 정렬시 앞, 뒤를 제어하는지에 대한 것이다. 이를 확인하기 위해서는 예제를 통해 확인하는 것이 가장 빠르게 확인할 수 있는 방법인데, 아래의 예제를 한 번 보도록 하자.
List<int> list = [1, 4, 2, 3, 6, 5, 8, 7, 9, 0];
list.sort((a, b) {
if(a < b) {
return -1;
}else{
return 1;
}
});
print(list);
결과 : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
이처럼, compare
에 해당하는 함수가 -1을 반환할 경우 a가 앞서는 순서로 정렬되고, 반환값이 1인 경우 b가 앞서는 순서로 정렬되게 된다. 그리고 0인 경우 a, b의 순서가 변경되지 않는다.
여기까지 Dart의 sort에 대해 알아보았는데, 글을 작성하기 위해 Dart 코드를 깊게 들여다 보니 작성된 내용보다 심화된 내용이 굉장히 많아 완벽히 이해하지 못한 채로 작성하고 싶지 않아서 여기까지 작성해본다.
나중에 sort를 좀 더 들여다 본 다음에는 dart내부에서 어떤 알고리즘으로 sort를 수행하는지도 알아볼 생각이다.