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의 변경사항을 알아봤다.