더북(TheBook)

이러한 예에서 볼 수 있듯이 :: 연산자는 객체 또는 클래스와 메서드 이름을 구분하며, 다음 세 가지 주요 경우가 있다.

• object::instanceMethod

• Class::staticMethod

• Class::instanceMethod

 

처음 두 경우에서 메서드 레퍼런스는 메서드의 파라미터를 제공하는 람다 표현식에 해당한다. 앞서 언급한 것처럼 System.out::printlnx -> System.out.println(x)에 해당한다. 마찬가지로 Math::pow(x, y) -> Math.pow(x, y)에 해당한다.

세 번째 경우에서는 첫 번째 파라미터가 해당 메서드의 대상이 된다. 예를 들어, String::compareToIgnoreCase(x, y) -> x.compareToIgnoreCase(y)와 같다.

<Note>

이름이 같은 여러 메서드가 오버로드되어 있을 때는 컴파일러가 의도한 문맥을 찾으려고 할 것이다. 예를 들어, Math.max 메서드는 정수와 부동소수점 수를 받는 버전이 있다. 이 중 어느 버전이 선택되는지는 Math::max가 변환되는 대상 함수형 인터페이스의 메서드 파라미터에 의존한다. 람다 표현식과 마찬가지로, 메서드 레퍼런스는 독립적으로 존재하지 않고 항상 함수형 인터페이스의 인스턴스로 변환된다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.