ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 람다 표현식 (메서드 레퍼런스)
    Java 2019. 12. 22. 00:42
    반응형

     메서드 레퍼런스를 이용하면 클래스에 정의된 메서드를 이용해서 람다처럼 함수를 전달할 수 있습니다.

    public class Foo {
    
        private int value;
    
        public Foo(int value) {
            this.value = value;
        }
    
        public int getValue() {
            return value;
        }
    
        public void setValue(int value) {
            this.value = value;
        }
    
        @Override
        public String toString() {
            return "Foo{" +
                    "value=" + value +
                    '}';
        }
    }
    import java.util.function.Consumer;
    
    public class FirstMain {
    
        public static void main(String[] args) {
            Consumer<Foo> consumer = System.out::println;
    
            consumer.accept(new Foo(5));
        }
    }

    실행 결과

     

     코드를 그냥 간단하게 아래와 같이 작성해도 같은 결과가 나오기 때문에 예시의 코드가 조금 불필요하고 억지스러운 부분이 있지만 간단하게 메서드 레퍼런스가 무엇인가에 대해서 나타내보고자 하였습니다.

    System.out.println(new Foo(5));

     

     메서드 레퍼런스는 명시적으로 메소드 이름을 참조함으로써 코드를 간결하고 가독성있게 바꿀 수 있습니다. 메서드 레퍼런스는 메서드명 앞에 구분자 (::) 를 붙이는 방법으로 사용할 수 있습니다.

     

     

    메서드 레퍼런스를 만드는 방법에는 3가지 유형이 있습니다.

    1. 정적 메서드 레퍼런스

    ex) Integer 클래스의 parseInt 메서드 : Integer::parseInt

     

    2. 다양한 형식의 인스턴스 메서드 레퍼런스

    ex) String 의 length 메서드 : String::length

     

    3. 기존 객체의 인스턴스 메서드 레퍼런스

    ex) Bar 라는 객체의 인스턴스를 할당받은 bar 라는 지역 변수가 있고, Bar 객체의 getName 이라는 메서드가 있다면 bar::getName 과 같이 표현하여 이용할 수 있습니다.

        public String getBarName(Bar bar) {
            Supplier<String> supplier = bar::getName;
    
            return supplier.get();
        }

     

    생성자 레퍼런스

     ClassName::new 와 같이 클래스명과 new 키워드를 이용해서 기본 생성자의 레퍼런스를 만들 수 있습니다.

    //Supplier<Foo> supplier = () -> new Foo(); 아래의 코드와 같습니다.
    Supplier<Foo> supplier = Foo::new;

     

    Foo(int value) 라는 시그니처를 가진 생성자는 IntFunction 인터페이스의 시그니처와 같습니다. 이러한 모양은 다음과 같은 코드로 구현할 수 있습니다.

            IntFunction<Foo> function = Foo::new;
            Foo foo_2 = function.apply(5);
            System.out.println(foo_2);
            
            //result
            //Foo{value=5}

            List<Integer> values = Arrays.asList(1, 2, 3, 4, 5);
            List<Foo> foos = map(values, Foo::new);
            for (Foo foo : foos) {
                System.out.println(foo);
            }
            
        //------------------------------------------------
        
        public static List<Foo> map(List<Integer> list, Function<Integer, Foo> f) {
            List<Foo> result = new ArrayList<>();
            for (Integer i : list) {
                result.add(f.apply(i));
            }
            return result;
        }

     

     


    참고자료

    자바 8 인 액션 <<한빛미디어>>

    반응형

    댓글

Designed by Tistory.