자바 - 메서드 레퍼런스

SeungTaek·2021년 8월 22일
0

자바(Java)

목록 보기
2/8
post-thumbnail

본 게시물은 스스로의 공부를 위한 글입니다.
틀린 내용이 있을 수 있습니다.

📒 메소드 레퍼런스(method reference)

  • 람다가 하는 일이 기존 메소드 또는 생성자를 호출하는 거라면, 메소드 레퍼런스를 이용해 간결하게 표현할 수 있다.
  • 즉, 하나의 메서드만 호출하는 람다식은 메소드 레퍼런스를 이용해 더 간단히할 수 있다.

📌 1. 스태틱 메소드 참조: 클래스::메서드

(x) -> ClassName.method(x) //람다식
ClassName::method //메서드 참조
  • 아래 코드와 같은 메소드가 있다고 생각하자.
Integer method(String s){
    return Integer.parseInt(s);
}
  • 람다식으로 바꾸면 다음과 같은 코드가 된다.
Function<String, Integer> f = (String s)->Integer.parseInt(s); //람다식
  • 람다식에서 Function<String, Integer>을 보자.
    • input이 String이고 output이 Integer이라는 정보를 이미 담고있다.
    • 따라서 중복되는 정보를 없앨 수 있는데, 그럼 다음과 같은 코드가 완성된다.
Function<String, Integer> f = Integer::parseInt; //메소드 참조

메소드 레퍼런스 코드가 이해가 안되다면, 거꾸로 람다식으로 바꿔서 이해해보자.

📌 2. 생성자 참조: 타입::new

파라미터가 없는 경우

Supplier<MyClass> s = () -> new MyClass(); //람다식
Supplier<MyClass> s = MyClass::new //메서드 참조

파라미터가 1개인 경우(파라미터가 2개이면 BiFunction 사용하면 된다.)

Function<Integer, MyClass> s = i -> new MyClass(i); //람다식
Function<Integer, MyClass> s = MyClass::new; //람다식

배열과 메서드 참조

Function<Integer, int []> s = i -> new int[i]; //람다식
Function<Integer, int []> s = int[]::new; //람다식

📌 3. 특정 객체의 인스턴스 메소드 참조: 객체 레퍼런스::인스턴스 메소드

거의 안쓴다.

(x) -> obj.method(x) //람다
obj::method //메서드 참조

📌 복합 예제

public class Main {
    public static void main(String[] args) {
        //스태틱 메소드 참조
        Function<String, String> hi=Greeting::hi;
        hi.apply("user");

        //생성자 참조(인자 없는 생성자)
        Supplier<Greeting> newGreeting=Greeting::new;
        //생성자 참조(String 받는 생성자)
        Function<String, Greeting> greeting=Greeting::new;
        
        //인스턴스 메소드 참조
        Greeting obj=new Greeting();
        Function<String, String> hello=obj::hello;

    }
}

class Greeting{
    private String name;
    public Greeting(){}

    public Greeting(String name){
        this.name=name;
    }

    public String hello(String name){
        return "hello "+name;
    }

    public static String hi(String name){
        return "hi "+name;
    }
}

Reference

이것이 자바다.
인프런 더 자바(백기선)

profile
I Think So!

0개의 댓글