자바 메서드 레퍼런스

연어는결국강으로·2023년 9월 29일
0

자바 공부

목록 보기
3/6

물론이죠. 메서드 레퍼런스는 람다 표현식의 축약 형태로 보는 것이 좋습니다. 각 메서드 레퍼런스의 종류에 따른 상세 설명을 아래에 제공하겠습니다.

  1. 정적 메서드 레퍼런스 (ClassName::staticMethodName):

    • 정적 메서드를 참조하는 데 사용됩니다.
    • 예:
      List<String> strings = Arrays.asList("a", "b", "c");
      strings.forEach(System.out::println); // System.out.println(s)와 같은 의미
  2. 한정적 인스턴스 메서드 레퍼런스 (instance::methodName):

    • 특정 객체의 인스턴스 메서드를 참조하는 데 사용됩니다.
    • 예:
      String str = "hello";
      Supplier<String> supplier = str::toUpperCase; // str.toUpperCase()와 같은 의미
      System.out.println(supplier.get()); // 출력: HELLO
  3. 비한정적 인스턴스 메서드 레퍼런스 (ClassName::methodName):

    • 특정 객체를 명시하지 않고, 클래스의 인스턴스 메서드를 참조합니다.
    • 이 타입의 메서드 레퍼런스는 첫 번째 파라미터로 인스턴스를 받습니다.
    • 예:
      List<String> list = Arrays.asList("a", "b", "A", "B");
      list.sort(String::compareToIgnoreCase); // s1.compareToIgnoreCase(s2)와 같은 의미
  4. 생성자 레퍼런스 (ClassName::new):

    • 클래스의 생성자를 참조하는 데 사용됩니다.
    • 예:
      Supplier<List<String>> supplier = ArrayList::new; // new ArrayList<>()와 같은 의미
      List<String> newList = supplier.get();

메서드 레퍼런스는 주로 함수형 인터페이스와 함께 사용되며, 함수형 인터페이스의 추상 메서드의 시그니처와 참조하는 메서드의 시그니처가 일치해야 합니다. 예를 들어, Function<T, R> 인터페이스의 apply 메서드는 한 개의 입력 파라미터를 받고 결과를 반환하는 메서드를 참조할 수 있습니다.

이해를 도와줄 수 있도록 위의 예제를 통해 각 메서드 레퍼런스의 사용법을 살펴봤습니다. 이러한 방식으로 람다 표현식을 더 간결하게 표현할 수 있습니다.

예제

receiverUserIdList.stream().map(dto::toEntity) 코드에서의 dto::toEntity는 비한정적 인스턴스 메서드 레퍼런스입니다.

이는 아래의 람다 표현식과 동일한 의미입니다.

receiverUserIdList.stream().map(user -> dto.toEntity(user))

즉, dto::toEntity는 스트림의 각 요소를 toEntity 메서드의 파라미터로 전달하며, 이때 해당 메서드는 dto 객체의 인스턴스 메서드로 호출됩니다. 결과적으로 스트림에서 처리되는 각 User 객체는 dto.toEntity(user)의 호출 결과로 변환됩니다.

간결하게 메서드 레퍼런스를 사용하여 코드를 작성할 수 있지만, 메서드의 시그니처와 람다 표현식의 대상 유형이 일치해야 합니다.

0개의 댓글