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

KH CHO님의 프로필 이미지
KH CHO

작성한 질문수

더 자바, Java 8

메소드 레퍼런스

Comparator interface를 compareToIgnoreCase로 메소드 레퍼런스로 변경 관련

작성

·

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

KH CHO님의 프로필 이미지
KH CHO
질문자

구글링을 해본 결과 제가 강의 내용에서 '임의 객체의 인스턴스 메소드 참조' 에 대한 이해를

다른  '스태틱 메소드 참조', '특정 개게의 인스턴스 메소드 참조', '생성자 참조'와 같이 방식으로 이해했었습니다.

하기 링크 참고를해서 다시 강의를 보니 이해가 되었습니다.

https://imcts.github.io/java-method-reference/

첫 번째 형태에서는 첫번째 파라미터가 메소드의 수신자가 되고, 나머지 파라미터는 해당 메소드로 전달 됩니다.
ex) String::compareToIgnoreCase는 (x, y) -> x.compareToIgnoreCase(y) 와 같습니다.

감이 안잡혔는데  덕분에  이해가 됐습니다  감사합니다

1

KH CHO님의 프로필 이미지
KH CHO
질문자

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

같은 의문이 있었는데, 먼저 확인해주셔서 감사합니다.

메소드 레퍼런스가 형태마다 조금씩 다른걸로 이해했습니다.

KH CHO님 고맙습니다.

0

KH CHO 님 정말 감사합니다 ㅠㅠ

0

백기선님의 프로필 이미지
백기선
지식공유자

아.. 잘 찾아서 이해하셨군요! 제가 수업에서 좀 더 자세히 설명했었다면 좋았겠네요. 좋은 질문과 답변 감사합니다.

0

백기선님의 프로필 이미지
백기선
지식공유자

Arrays의 sort 메소드가 받는 인자 타입을 보시면 이해하실 수 있을 것 같네요.

KH CHO님의 프로필 이미지
KH CHO

작성한 질문수

질문하기