Java - Method Reference

1 분 소요

Java - Method Reference

  • Java에는 이미 수많은 Class들과 Method들이 있습니다. Java에서 Function을 이용해서 프로그래밍을 한다고 할때, Class 혹은 Object의 Method들을 가져와서 동일한 기능을 가지는 함수로 사용할 수 있다면, 좀 더 유영한 프로그래밍이 가능하겠죠.
  • 이처럼 Method를 가져와서 Function에 넣어주는 것을 Method Reference라고 합니다. ::로 구분하여 앞에는 메소드가 속한 것을, 뒤에는 메소드이름을 써주면 됩니다.
class_or_instanceName::itsMethodName

Method Reference Example

  • Consumer, Supplier, Function 3가지 타입에 대해서 Method Reference를 사용해주었습니다.
import java.util.function.*;

class Main {
    public static Integer multiFunc(Integer x, Integer y, Function<Integer, Integer> func) {
        // x, y에 각각 func를 적용한 다음 곱을 리턴하는 함수
        return func.apply(x) * func.apply(y);
    }
    public static void main(String[] args) throws Exception {

        // --------------------------------------------
        // Consumer: input은 있으나, output이 없는 함수
        // System.out.println 은 static method이므로
        // className::methodName으로 사용합니다.
        Consumer<String> justPrintFunc = System.out::println;
        // 사실 그냥 이렇게 만들어도 되는 것이긴 하죠.
        Consumer<String> justPrintFuncAlt = (String s) -> System.out.println(s);
        // .accept method를 사용해서 input을 받습니다.
        justPrintFunc.accept("This is justPrintFunction"); // "This is justPrintFunction"
        justPrintFuncAlt.accept("This is justPrintFunctionAlt"); // "This is justPrintFunctionAlt"

        // --------------------------------------------
        // Supplier: input은 없지만, output은 있는 함수
        // scanner.nextLine 은 instance method이므로 Object를 생성한 다음
        // Object::methodName 로 사용합니다.
        Scanner scanner = new Scanner(System.in);
        Supplier<String> justReadFunc = scanner::nextLine;
        // Supplier의 경우 input이 없지만, ()는 써줘야 하죠.
        Supplier<String> justReadFuncAlt = () -> scanner.nextLine();
        // .get method를 사용해서 결과를 받습니다.
        justPrintFunc.accept(justReadFunc.get());

        // --------------------------------------------
        // Function에 Math.sqrt를 Binding해줍니다.
        Function<Double, Double> sqrt = Math::sqrt;
        System.out.println(sqrt.apply(9.0));
    }
}

댓글남기기