Comparator interface를 compareToIgnoreCase로 메소드 레퍼런스로 변경 관련
762
작성한 질문수 1
강의 내용 중 '임의 객체의 인스턴스 메소드 참조' 관련해
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
7
구글링을 해본 결과 제가 강의 내용에서 '임의 객체의 인스턴스 메소드 참조' 에 대한 이해를
다른 '스태틱 메소드 참조', '특정 개게의 인스턴스 메소드 참조', '생성자 참조'와 같이 방식으로 이해했었습니다.
하기 링크 참고를해서 다시 강의를 보니 이해가 되었습니다.
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로 나와서 파악을 못 했습니다 ㅠㅠ
이럴 때는 어떻게 디버깅을 하고 추론하나요..?
CompletableFuture의 get 실행에 대해 궁금한 점이 있습니다
0
231
2
기본 인터페이스의 기본 제공 메서드 관련 질문 (왜 이걸 사용하는지)
0
515
2
static 과 metaspace 관련 질문있습니다.
0
707
0
Map의 가장 큰 특징이 key는 null이 아니다
0
2377
2
Optional 질문드립니다.
0
469
0
인텔리제이 콘솔창
0
579
0
Supplier를 쓰는 이유
0
1355
1
allOf()에서 컬렉션으로 반환하는 것을 설명할 때 코드
0
706
1
[참고] LTS주기
0
468
1
orElseThrow()
1
1082
2
findFirst함수
0
357
1
메서드 레퍼런스
1
477
1
primitive type 질문
0
301
1
FunctionalInterface 상속 관계 질문
0
292
1
함수형 인터페이스를 왜 사용하나요?
1
496
1
while문 세미콜론
0
430
1
flatMap Optional과 Stream에서의 차이점을 제가 잘 이해했는지 헷갈립니다!
0
404
1
람다식과 익명 클래스
0
318
1
steam api 예제 git 주소
3
782
1
thread.sleep질문
0
383
2
.orElse 매개변수 질문
0
260
1
isPresent( ) 와 null 질문
0
333
1
예제 코드 질문
2
286
1
코드 질문있습니다.
0
233
1





