이 영역을 누르면 첫 페이지로 이동
Arc 블로그의 첫 페이지로 이동

Arc

페이지 맨 위로 올라가기

Arc

[Java] 메서드 참조

  • 2023.04.04 21:47
  • Language/Java
글 작성자: SeoArc

메서드 참조?

메서드 참조는 람다 표현식을 축약한 형태이다.

메서드 참조를 사용하면 람다 표현식을 더 줄일 수 있는데, 상황에 따라 가독성이 더 좋아보일 수 있다.

 

다음은 람다 표현식을 메서드 참조로 바꾼 예시이다

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

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [Java] HttpServlet

    [Java] HttpServlet

    2023.04.06
  • [Java] 스트림(Stream)

    [Java] 스트림(Stream)

    2023.04.06
  • [Java] 람다 타입 검사/추론/제약

    [Java] 람다 타입 검사/추론/제약

    2023.04.04
  • [Java] 함수형 인터페이스

    [Java] 함수형 인터페이스

    2023.04.03
다른 글 더 둘러보기

정보

Arc 블로그의 첫 페이지로 이동

Arc

  • Arc의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 방명록

카테고리

  • 분류 전체보기 (106)
    • Language (28)
      • C++ (0)
      • C# (0)
      • Java (28)
    • Algorithm (47)
      • Algorithm (15)
      • Data Structure (6)
      • PS (26)
    • Computer Science (22)
      • Design Pattern (1)
      • Network (14)
      • OS (7)
    • Game (0)
      • Unity (0)
    • Backend (3)
      • Spring (1)
      • JPA (2)
    • DB (0)
      • SQL (0)
    • DevOps (2)
      • AWS (0)
      • Docker (2)
      • Jenkins (0)
      • Nginx (0)
    • Software Engineering (4)
      • OOP (4)
    • AI (0)
      • Machine Learning (0)
    • Others (0)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • java
  • 자바
  • 네트워크
  • graph
  • algorithm
  • 알고리즘
  • 그래프
  • network

나의 외부 링크

정보

SeoArc의 Arc

Arc

SeoArc

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © SeoArc. Designed by Fraccino.

티스토리툴바