본문 바로가기

JAVA

[JAVA 8] 메서드 레퍼런스 알아보기!

728x90
반응형




메서드 레퍼런스는 특정 메서드만을 호출하는 람다의 축약 표현이라고 생각할 수 있다.
람다가 특정 메서드를 직접 호출하게 된다면 메서드를 어떻게 호출해야 하는지 설명을 참조 하기 보다 메서드 명을 직접 참조 하도록 하는 것이다.

메서드 레퍼런스를 이용한다면 기존 메서드 구현으로 람다 표현식을 만들 수 있다.
이때 명시적으로 메서드명을 참조 하게 됨으로서 가독성을 높일 수 있는 장점이 있다.

메서드 레퍼런스는 메서드명 앞에 구분자 (::)를 붙이는 방식으로 사용된다.
Car :: getPrice (== (Car c) -> getPrice())는 Car 클래스의 getPrice의 메서드 레퍼런스를 뜻한다.

[예제]
(Car c) -> c.getPrice() =========> Car :: getPrice
() -> Thread.currentThread().dumpStack() =========> Thread.currentThread()::dumpStack
(str, i) -> str.substring(i) =========> String::substring
(String s) -> System.out.println(s) =========> System.out::println

메서드 레퍼런스는 하나의 메서드를 참조하는 람다를 편리하게 표현할 수 있는 문법이다.
메서드 레퍼런스를 이용하면 같은 기능을 더 간결하게 구현할 수 있다.



<메서드 레퍼런스 만드는 방법>

1. 정적 메서드 레퍼런스
- Integer의 parseInt 메서드는 Integer::parseInt
2. 다양한 형식의 인스턴스 메서드 레퍼런스
- String의 length 메서드는 String::length
3. 기존 객체의 인스턴스 메서드 레퍼런스
- Car 객체를 할당받은 bmw 지역 변수가 있고, Car 객체에는 getPrice라는 메서드가 있다면 bmw::getPrice라고 표현할 수 있다.


생성자, 배열 생성자, super 호출 등에 사용할 수 있는 특별한 형식의 메서드 레퍼런스도 있다.


<생성자 레퍼런스>

ClassName::new 처럼 클래스명과 new 키워드를 이용해서 기존 생성자의 레퍼런스를 만들 수 있다.

1> 인수가 없는 생성자
Supplier의 ()->Car

Supplier<Car> c1 = Car::new;
Car c2 = c1.get();

2> 인수가 하나인 생성자
Function 인터페이스의 시그너처와 같다.

Function<Integer, Car> f1 = Car :: new
Car c1 = f1.apply(100);


[예]

List<Integer> prices = Arrays.asList(100,200,300);
List<Car> cars = map(prices, Car::new);

public static List<Car> map (List<Integer> prices, Function<Integer, Car> f){
List<Car> cars = new Array<>();
for(Integer price : prirces){
cars.add(f.apply(price)));
}
return cars;
}

3> 인수가 두개인 생성자
BiFunction인터페이스와 같은 시그너처를 가진다.

BiFunction<String, Integer, Car> c3 = Car::new;
Car c4 = c3.apply("bmw", 1000);


[출처 : JAVA8 in Action]

728x90
반응형