Comparator질문입니다
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함수까지 호출되서 비교를 할수있는거죠?이해가안갑니다...함수 호출을안해는데..
Answer 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()함수를 호출하는 것을 확인 할 수 있습니다.
제네릭 타입 매개변수 제한과 관련한 문의입니다.
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
57
1
compareTo
0
65
1
직접 구현하는 연결리스트 3 - 추가 부분 질문있습니다
0
94
3
섹션 8-58 equals and hashcode 에서 코드가 다르게 생성됨
0
66
2
퀴즈 오류 관련 문의
0
102
1

