해결된 질문
작성
·
87
1
public class SortMain2 {
public static void main(String[] args) {
Integer[] arr = {3,2,1};
System.out.println(Arrays.toString(arr));
System.out.println("Comparator 비교");
Arrays.sort(arr,new AscComparator());
System.out.println("AscComparator:"+Arrays.toString(arr));
}
}
public class AscComparator implements Comparator<Integer> {
@Override
public int compare(Integer o1, Integer o2) {
if(o1 > o2){
return 1;
} else if (o1 == o2) {
return 0;
}else return -1;
}
}
SortMain2함수에서 Arrays.sort(arr,new AscComparator());
부분에서 new AscComapator()로 객체만 생성했는데 어떻게 compare함수까지 호출되서 비교를 할수있는거죠?이해가안갑니다...함수 호출을안해는데..
답변 2
2
안녕하세요. 임다정님, 공식 서포터즈 OMG입니다.
이동언님께서 좋은 답변을 남겨주셨는데요 😀
객체 인스턴스를 new로 생성하여 전달하였기 때문에 호출이 가능하며, 호출 시점은 코드 레벨로 설명드릴게요 ^^
Arrays.sort()는 아래와 같이 다양한 인자를 지원하는 메서드 오버로딩이 적용되어 있는데요
그 중 강의 코드는 아래의 메서드를 호출할 것입니다.
첫번째 인자로는 제네릭 타입의 배열 (T[] a) 그리고 두번째 인자로는 Comparetor를 구현한 객체를 인자로 받습니다.
어떤 메서드를 호출하는지 확인했으니, 실제 이 메서드에서 어떤 동작을 하는지 살펴볼게요.
두번째 인자의 이름이 c로 정의되어 있는 걸 볼 수 있으며, 강의에서는 null이 아닌 new 연산자를 사용헀으니 else 구문이 실행됩니다. else구문을 보니 legacyMergeSort()와 TimSort가 동작하는걸 볼 수 있네요 😀
legacyMergeSort는 그 안에서 megesort()를 호출하고 있으니 merserSort도 확인해보면,
comparator c의 compare()를 호출하는 걸 볼 수 있습니다.
private static void mergeSort(Object[] src,
Object[] dest,
int low, int high, int off,
Comparator c) {
int length = high - low;
// 생략..
for(int i = destLow, p = low, q = mid; i < destHigh; i++) {
if (q >= high || p < mid && c.compare(src[p], src[q]) <= 0) // c의 compare() 호출
dest[i] = src[p++];
else
dest[i] = src[q++];
}
}
마찬가지로 처음의 조건분기에서 볼 수 있었던 TimSort.sort()도 내부적으로 binarySort()를 호출하는데요,
binarySort()에서 compare()를 호출합니다 😀
정리하면 compare()는 if/else 조건에 의해 아래와 같은 경우에 호출이 될 수 있습니다 😀
(1) Arrays.sort() -> legacyMergeSort() -> Sort() -> c.compare()
(2) Arrays.sort() -> Timsort.sort() -> binarySort() -> c.compare()
감사합니다.
1
Arrays.sort(arr,new AscComparator());
위 함수가 구현되어 있는 곳을 살펴보면 매개변수로 받은 AscComparator객체의 compare()함수를 호출하는 것을 확인 할 수 있습니다.
자세한 설명감사합니다!