인프런 커뮤니티 질문&답변

임다정님의 프로필 이미지

작성한 질문수

김영한의 실전 자바 - 중급 2편

Comparator질문입니다

해결된 질문

작성

·

82

0

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()는 아래와 같이 다양한 인자를 지원하는 메서드 오버로딩이 적용되어 있는데요

image.png

그 중 강의 코드는 아래의 메서드를 호출할 것입니다.

image.png

첫번째 인자로는 제네릭 타입의 배열 (T[] a) 그리고 두번째 인자로는 Comparetor를 구현한 객체를 인자로 받습니다.

어떤 메서드를 호출하는지 확인했으니, 실제 이 메서드에서 어떤 동작을 하는지 살펴볼게요.

image.png

두번째 인자의 이름이 c로 정의되어 있는 걸 볼 수 있으며, 강의에서는 null이 아닌 new 연산자를 사용헀으니 else 구문이 실행됩니다. else구문을 보니 legacyMergeSort()와 TimSort가 동작하는걸 볼 수 있네요 😀

image.png

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()를 호출하는데요,

image.png

 

binarySort()에서 compare()를 호출합니다 😀

image.png

 

정리하면 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()함수를 호출하는 것을 확인 할 수 있습니다.