작성
·
553
4
강의 내용 중 '임의 객체의 인스턴스 메소드 참조' 관련해
Arrays.sort() 에서 Comparator interface를 String의 compareToIgnoreCase()로 메소드 레퍼런스 하는 것과 관련해서,
Compartor의 추상함수는 compare(String, String)으로 param인자가 2개인데, String의 compareToIgnoreCase()는
public int compareToIgnoreCase(String str) {
return CASE_INSENSITIVE_ORDER.compare(this, str);
}
같이 String 인자 하나인데 method reference가 되는 이유가 궁금합니다.
메소드 레퍼런스의 경우 입력인자와 출력인자가 동일한 경우 치환하는 것 처럼 이해를 해서요 ^^;
답변 8
6
구글링을 해본 결과 제가 강의 내용에서 '임의 객체의 인스턴스 메소드 참조' 에 대한 이해를
다른 '스태틱 메소드 참조', '특정 개게의 인스턴스 메소드 참조', '생성자 참조'와 같이 방식으로 이해했었습니다.
하기 링크 참고를해서 다시 강의를 보니 이해가 되었습니다.
https://imcts.github.io/java-method-reference/
첫 번째 형태에서는 첫번째 파라미터가 메소드의 수신자가 되고, 나머지 파라미터는 해당 메소드로 전달 됩니다.
ex) String::compareToIgnoreCase는 (x, y) -> x.compareToIgnoreCase(y) 와 같습니다.
1
sort의 인자 타입은 확인 했는데,
public static <T> void sort(T[] a, Comparator<? super T> c)
저 Comparator내에 abstract method가
int compare(T o1, T o2);
한 개라서 해당 method를 lambda로 치환한게
(o1, o2) -> 0 이구
여기서 parameter가 o1, o2 두개 인데
method reference로 치환되는
compareToIgnoreCase는
public int compareToIgnoreCase(String str) {
return CASE_INSENSITIVE_ORDER.compare(this, str);
}
String 한개 입니다.
그래서 이게 어떻게 method reference로 치환되는지 이해가 잘 안가네요..;
compareToIgnore안에 구현된
CASE_INSENSITIVE_ORDER.compare(this, str);
라면 이해가되는데요..
강의를 몇번 돌려 봤는데도 잘 이해가 안가서 다시 한번 여쭤봅니다 ^^;;;
혹시 참조하려고 하는 method 내부에 this를 사용하면 참조하려고 하는 method의 param에 자기 자신에 대한 타입이 하나 더 들어간다고 생각해야 하나요?
0
궁금해서 디버깅을 좀 해봤는데 오름차순 정렬기준,
String[] names = {"f", "e", "a", "c", "b", "d"};
Arrays.sort(names, String::compareToIgnoreCase);
이렇게 정렬을 하게되면 먼저 내림차순이 반복되는 구간 찾게되는데
이 과정에서
{"f", "e", "a", "c", "b", "d"}
가
{ "a", "e", "f", "c", "b", "d"}
로 정렬됩니다
이때
"e".compareToIgnoreCase("f")
"a".compareToIgnoreCase("e")
"c".compareToIgnoreCase("a")
이 순서대로 비교해서 내림차순이 반복되는 구간을 찾습니다
내림차순이 끝난 좌표 ( "c"인 3 )를 pivot으로 삼고 pivot 기준 왼쪽의 배열값을 대상으로하여 Binary Insertion Sort로 pivot 값이 들어갈 위치를 찾고 pivot을 하나씩 증가시키면서 반복하는 구조로 보이네요
이때는
배열[pivot].compareToIgnoreCase( 배열[mid] )
로 비교하구요
0
ㅠㅠ 아직 이해를 잘 못 했는데요,
Arrays.sort(names, String::compareToIgnoreCase);
이렇게 하면 String::compareToIgnoreCase에서 내부적으로 받는 파라미터 this는 "keesun", "whiteshipe", "toby"를 순서대로 받고 str은 "whiteship", "toby" 순으로 받아서 비교하게 되는건가요?
String::compareToIgnoreCase는 (x,y) -> x.compareToIgnoreCase(y)와 같다고 하셨는데요,
"keesun".compareToIgnoreCase("whteship")을 비교해서 true , false 반환,
"whteship".compareToIgnoreCase("toby")을 비교해서 true , false 반환, 하는 방식이 맞나요?
디버깅을 해보려고 시도했는데, 배열 안의 문자열이 나오는게 아니라 ~.class로 나와서 파악을 못 했습니다 ㅠㅠ
이럴 때는 어떻게 디버깅을 하고 추론하나요..?
0
0
0
0
감이 안잡혔는데 덕분에 이해가 됐습니다 감사합니다