-
[Java] 메서드 참조란?Java 2022. 1. 25. 00:01728x90
메서드 참조란?
메서드 참조는 람다 표현식이 단 하나의 메서드만을 호출하는 경우 해당 람다 표현식에서 불필요한 매개변수를 제거하고 사용할 수 있도록 해줍니다.
람다식으로 메서드를 간결하게 표현할 수 있는데 람다식을 더욱 간결하게 표현하는 방법
(단, 람다식이 하나의 메서드만을 호출하는 경우)
메서드 참조 예시
아래의 wrapper메서드는 문자열을 정수로 반환하는 일을 합니다.
Integer wrapper(String s) { return Integer.parseInt(s); }
이를 람다식으로 표현해 보겠습니다
Function<String, Integer> f = (String s) -> Integer.parseInt(s);
이를 메서드 참조로 표현해 보겠습니다
Function<String, Integer> f = Integer::parseInt;
메서드 참조에서 람다식의 일부가 생략되었지만, 컴파일러는 생략된 부분을 parseInt메서드의 선언부로부터, 또는 좌변의 Function 인터페이스에 지정된 지네릭 타입으로부터 쉽게 알아낼 수 있습니다.
아래의 람다식은 BiFunction 인터페이스를 구현하여 s1, s2문자열을 비교하여 true/false를 반환하는 람다식입니다.
BiFunction<String, String, Boolean> f = (s1, s2) -> s1.equals(s2);
이를 메서드 참조로 표현해 보겠습니다.
BiFunction<String, String, Boolean> f = String::equals;
참조 변수 f의 타입인 BiFunction을 통하여 String 타입의 매개변수를 2개 받는 다른 것을 알 수 있습니다.
따라서 람다식의 매개변수들은 없어도 됩니다.
이때 equals라는 이름의 메서드는 다른 클래스에도 존재할 수 있기 때문에 앞에 클래스의 이름은 반드시 필요합니다.
메서드 참조 사용법
하나의 메서드만 호출하는 람다식은 '클래스 이름::메서드 이름'으로 바꿀 수 있습니다.
생성자의 메서드 참조
생성자를 호출하는 람다식도 메서드 참조로 변환할 수 있습니다.
Supplier<MyClass> s = () -> new MyClass(); //람다식 Supplier<MyClass> s = MyClass:new; //메서드 참조 MyClass mc = s.get();
만약 매개변수가 있는 생성자라면, 매개변수의 개수에 따라 알맞은 함수형 인터페이스를 사용하면 됩니다.
Function<Integer, MyClass> f = (i) -> new MyClass(i); //람다식 Function<Integer, MyClass> f2 = MyClass::new; //메서드 참조 BiFunction<Integer, String, MyClass> bf = (i,s) -> new MyClass(i,s); //람다식 BiFunction<Integer, String, MyClass> bf = MyClass::new; //메서드 참조
출처
자바의 정석
http://www.tcpschool.com/java/java_lambda_reference
https://www.youtube.com/watch?v=I55ALQndw50
'Java' 카테고리의 다른 글
[Java] 스트림(Stream)이란? + 특징, 등장배경 (0) 2022.01.29 [Java] 싱글톤(Singleton)이란? (0) 2022.01.27 [Java] Math.random() vs java.util.Random 효율성 차이점 비교 (0) 2022.01.24 [Java] java.util.function 패키지란? (0) 2022.01.22 [Java] 래퍼 클래스(Wrapper Class)란? (0) 2022.01.20