ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JAVA8에 대해 알아보자(3)
    카테고리 없음 2023. 4. 18. 12:31

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

    댓글

Designed by Tistory.