java8

이번엔 메소드 레퍼런스에 대해 알아보자.
메소드 레퍼런스를 알아보기전에 알아두어야 할 것이 있다.
first-class citizen(일급 시민) 이 용어는 60년대에 크리스토퍼 스트래치 라는 분이 만들었다.
first-class citizen란 무엇인가.
일단 내가 알고 있는 것으로 설명하겠다.
1. 파라미터로 전달받을 수 있어야 한다.
2. 리턴 값으로 반환 할 수 있어야 한다.
3. 변수 혹은 Data 구조에 담을 수 있어댜 한다.

그럼 필자가 말한 위에 3개가 자바에서 가능 한지를 알아보겠다.
첫 번째로 파라미터롤 전달 받을 수 있는지 알아보자.

일단 function을 담을수 있는 functionalInteface를 만들자

@FunctionalInterface
interface Functional{
    String apply(Integer i);
}

그리고 메소드를 전달하기 위한 메소드를 만들어 보자

private static String methodReferenceParameter(Functional functional){
    return "result : " + functional.apply(1);
}

간단하다 methodReferenceParameter라는 메소드는 Functional을 파라미터로 받고 String으로 돌려주는 메소드이다.
그럼 일반적으로 람다를 쓸경우엔 어떻게 쓰는지 보자.

String lambda = methodReferenceParameter(i -> String.valueOf(i));
System.out.println(lambda);

이렇게 호출하면 result : 1 이런 결과값을 얻을 수 있다.
다음은 메소드 레퍼런스를 사용해보자.
일단 메소드를 넘길려면 메소드를 만들어야 된다. 위에 람다에서 사용했던 String.valueOf(i)를 메소드로 만들어 보자

private static String methodReference(int i){
    return String.valueOf(i);
}

이제 사용해보자!

String methodReference = methodReferenceParameter(MethodReferenceExample::methodReference);
System.out.println(methodReference);

결과는 같을 것이다.

다음으론 리턴 값을 반환 할 수 있는지 알아보자.
일단 비교를 위해 lambda로 먼저 해보겠다.

private static Functional methodReferenceReturnlambda(){
    return i -> String.valueOf(i);
}

사용해보자.

Functional functional = methodReferenceReturnlambda();
System.out.println("string : " + functional.apply(1));

string을 리턴하는 것 이기에 string 이라는 문자를 넣었다.

다음은 메소드 레퍼런스를 사용하여 리턴 값을 만들어 보자.

private static Functional methodReferenceReturn() {
    return MethodReferenceExample::methodReference;
}

호출해보자.

Functional methodReferenceReturn = methodReferenceReturn();
System.out.println("methodReferenceReturn : " + methodReferenceReturn.apply(1));

정상적으로 컴파일 후 실행이 될 것이다.

다음은 모지? 아 변수 혹은 Data구조에 담아 둘 수 있어야 한다.
List<T>에 담기는지 보자.

List<Functional> functionals = Arrays.asList(MethodReferenceExample::methodReference, i -> String.valueOf(i));

컴파일도 잘된다.
실행해보자

System.out.println(functionals.get(0).apply(100));
System.out.println(functionals.get(1).apply(200));

이렇게 사용하면 된다.
부가적으로 Syntax를 보자.
static 메소드는 ClassName::MethodName 으로 하면 된다.
인스턴스 메소드는 object::instanceMethodName으로 하고
생성자ClassName::new으로 정의하면된다.

이상으로 자바8의 변경사항을 알아봤다.