inflearn logo
강의

Course

Instructor

Kim Young-han's Practical Java - Intermediate Part 2

Comparator질문입니다

Resolved

177

chelim20028121

63 asked

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함수까지 호출되서 비교를 할수있는거죠?이해가안갑니다...함수 호출을안해는데..

java 객체지향 코딩-테스트 알고리즘

Answer 2

2

OMG

안녕하세요. 임다정님, 공식 서포터즈 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()

감사합니다.

0

chelim20028121

자세한 설명감사합니다!

1

smlove7268312

Arrays.sort(arr,new AscComparator());

위 함수가 구현되어 있는 곳을 살펴보면 매개변수로 받은 AscComparator객체의 compare()함수를 호출하는 것을 확인 할 수 있습니다.

제네릭 타입 매개변수 제한과 관련한 문의입니다.

0

74

3

강의가 좀 버겁다 느껴질 때 학습방법 문의

1

124

4

제네릭 반환값 및 파라미터 선언 방식의 변화 <T> T

0

53

1

new T()가 안 되는 니유

0

94

1

안녕하세요, 문제와 실행 결과가 다른 부분이 있어 제보드립니다.

0

95

2

자바 로드맵 선택 질문

0

107

2

실전 자바 중급 - 2편 후 추천 강의

0

171

2

실프로젝트에서 Java25버전 사용

0

111

1

Arrays.sort

0

66

1

블로그 작성 시, 저작권 문제에 대하여

0

164

1

중급2편 56강의 bucket.add(value); 메서드가 이해가 안됩니다.

0

91

3

pop()과 poll()의 차이

0

93

1

특정 index의 노드 조회하기 질문

0

64

2

List.of() 비어있는 불변 리스트 생성

0

79

2

문제2: 개 타입 반환

0

50

2

[리뷰] 중급2편까지 겨우 완강 했습니다.

0

108

2

문제와 풀이1 Ex2와 Ex3

0

63

2

노드 삭제시 노드 null값으로 초기화

0

73

2

강의영상에 대한 질문

0

55

1

타입 매개변수 제한

0

58

1

compareTo

0

65

1

직접 구현하는 연결리스트 3 - 추가 부분 질문있습니다

0

94

3

섹션 8-58 equals and hashcode 에서 코드가 다르게 생성됨

0

66

2

퀴즈 오류 관련 문의

0

102

1