-
[Java] 람다 표현식 (메서드 레퍼런스)Java 2019. 12. 22. 00:42반응형
메서드 레퍼런스를 이용하면 클래스에 정의된 메서드를 이용해서 람다처럼 함수를 전달할 수 있습니다.
public class Foo { private int value; public Foo(int value) { this.value = value; } public int getValue() { return value; } public void setValue(int value) { this.value = value; } @Override public String toString() { return "Foo{" + "value=" + value + '}'; } }
import java.util.function.Consumer; public class FirstMain { public static void main(String[] args) { Consumer<Foo> consumer = System.out::println; consumer.accept(new Foo(5)); } }
코드를 그냥 간단하게 아래와 같이 작성해도 같은 결과가 나오기 때문에 예시의 코드가 조금 불필요하고 억지스러운 부분이 있지만 간단하게 메서드 레퍼런스가 무엇인가에 대해서 나타내보고자 하였습니다.
System.out.println(new Foo(5));
메서드 레퍼런스는 명시적으로 메소드 이름을 참조함으로써 코드를 간결하고 가독성있게 바꿀 수 있습니다. 메서드 레퍼런스는 메서드명 앞에 구분자 (::) 를 붙이는 방법으로 사용할 수 있습니다.
메서드 레퍼런스를 만드는 방법에는 3가지 유형이 있습니다.
1. 정적 메서드 레퍼런스
ex) Integer 클래스의 parseInt 메서드 : Integer::parseInt
2. 다양한 형식의 인스턴스 메서드 레퍼런스
ex) String 의 length 메서드 : String::length
3. 기존 객체의 인스턴스 메서드 레퍼런스
ex) Bar 라는 객체의 인스턴스를 할당받은 bar 라는 지역 변수가 있고, Bar 객체의 getName 이라는 메서드가 있다면 bar::getName 과 같이 표현하여 이용할 수 있습니다.
public String getBarName(Bar bar) { Supplier<String> supplier = bar::getName; return supplier.get(); }
생성자 레퍼런스
ClassName::new 와 같이 클래스명과 new 키워드를 이용해서 기본 생성자의 레퍼런스를 만들 수 있습니다.
//Supplier<Foo> supplier = () -> new Foo(); 아래의 코드와 같습니다. Supplier<Foo> supplier = Foo::new;
Foo(int value) 라는 시그니처를 가진 생성자는 IntFunction 인터페이스의 시그니처와 같습니다. 이러한 모양은 다음과 같은 코드로 구현할 수 있습니다.
IntFunction<Foo> function = Foo::new; Foo foo_2 = function.apply(5); System.out.println(foo_2); //result //Foo{value=5}
List<Integer> values = Arrays.asList(1, 2, 3, 4, 5); List<Foo> foos = map(values, Foo::new); for (Foo foo : foos) { System.out.println(foo); } //------------------------------------------------ public static List<Foo> map(List<Integer> list, Function<Integer, Foo> f) { List<Foo> result = new ArrayList<>(); for (Integer i : list) { result.add(f.apply(i)); } return result; }
참고자료
자바 8 인 액션 <<한빛미디어>>
반응형'Java' 카테고리의 다른 글
[Java] ThreadLocal이란? (0) 2020.09.27 [Java] JVM의 구조 (0) 2020.07.28 [Java] Image Resize 방법 (1) 2019.12.17 [Java] 제네릭과 가변인수 (Effective Java 3rd_item32) (0) 2019.08.18 [Java] 한정적 와일드 카드 (Effective Java 3rd_Item31) (0) 2019.08.11