[Java] 메서드 참조
메서드 참조?
메서드 참조는 람다 표현식을 축약한 형태이다.
메서드 참조를 사용하면 람다 표현식을 더 줄일 수 있는데, 상황에 따라 가독성이 더 좋아보일 수 있다.
다음은 람다 표현식을 메서드 참조로 바꾼 예시이다
inventory.sort((Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight()));
inventory.sort(comparing(Apple::getWeight));
메서드 참조는 실제로 메서드를 호출하는 것이 아니기 때문에 괄호는 적지 않는다.
메서드 참조 형태
메서드 참조는 크게 3가지 형태가 있는데, 한 번 살펴보자.
정적 메서드 참조
예를 들어 Integer의 parseInt 정적 메서드를 다음과 같이 메서드 참조 형태로 바꿀 수 있다.
Function<String, Integer> function = s -> Integer.parseInt(s);
Function<String, Integer> function = Integer::parseInt;
다양한 형식의 인스턴스 메서드 참조
예를 들어, String의 length 메서드를 호출하는 람다 표현식을 다음과 같은 형태로 바꿀 수 있다.
Function<String, Integer> function = a -> a.length();
Function<String, Integer> function = String::length;
기존 객체의 인스턴스 메서드 참조
예를 들어, Member Class의 메서드를 호출하는 람다 표현식을 다음과 같은 형태로 바꿀 수 있다.
class Member {
private String name;
public String getName() {
return name;
}
}
Function<Member, String> function = member -> member.getName();
Function<Member, String> function = Member::getName;
컴파일러는 람다 표현식의 형식을 검사하던 방식과 비슷한 과정으로 메서드 참조가 주어진 함수형 인터페이스와 호환하는지 확인한다.
즉, 메서드 참조는 context의 형식과 일치해야 한다.
생성자 참조
클래스의 생성자도 메서드와 같이 참조를 만들 수 있다.
생성자 참조는 정적 메서드의 참조를 만드는 방법과 비슷하다.
예를 들어, Member Class를 생성하는 람다 표현식을 다음과 같이 작성할 수 있다.
Supplier<Member> supplier = () -> new Member();
Supplier<Member> supplier = Member::new;
만약 생성자에 파라미터가 있다면 다음과 같이 바꿔 작성할 수 있다.
Function<String, Member> function = name -> new Member(name);
Function<String, Member> function = Member::new;
항상 주의할 것은, 람다 표현식과 함수형 인터페이스와 시그니처가 같아야 한다는 것이다.
만약 Member 생성자가 Member(Long, String, String)와 같다면 이 시그니처를 갖는 함수형 인터페이스를 다음과 같이 선언해주어야 한다.
@FunctionalInterface
public interface MemberFunction<T, U, V, R> {
R apply(T t, U u, V v);
}
MemberFunction<Long, String, String, Member> memberFunction = Member::new;
'Language > Java' 카테고리의 다른 글
[Java] HttpServlet (0) | 2023.04.06 |
---|---|
[Java] 스트림(Stream) (0) | 2023.04.06 |
[Java] 람다 타입 검사/추론/제약 (0) | 2023.04.04 |
[Java] 함수형 인터페이스 (0) | 2023.04.03 |
[Java] 람다 표현식 소개 (0) | 2023.03.31 |
댓글
이 글 공유하기
다른 글
-
[Java] HttpServlet
[Java] HttpServlet
2023.04.06 -
[Java] 스트림(Stream)
[Java] 스트림(Stream)
2023.04.06 -
[Java] 람다 타입 검사/추론/제약
[Java] 람다 타입 검사/추론/제약
2023.04.04 -
[Java] 함수형 인터페이스
[Java] 함수형 인터페이스
2023.04.03