언어/java

[모던자바 인액션]#2 동작 파라미터화 코드 전달

silverbell 2021. 1. 13. 15:47

# chapter 2. 동작 파라미터화 코드 전달하기    

 

-. 동작파라미터화 : 어떻게 실행할 것인지 결정하지 않은 코드 블록

                                이 코드블록은 나중에 프로그램에서 호출. 즉, 코드 블록의 실행은 나중으로 미뤄진다.

    why)) 변화하는 요구사항에 대응하기 위해

    how)) 나중에 실행될 메서드의 인수로 코드블록을 전달할 수 있다.

 

    example) 룸메이트에게 빵, 치즈, 와인등의 식료품을 사달라 부탁

                    작업 수행 메서드 : go 

                    원하는 동작         : go 메서드의 인수

 

[step 1] interfaca 객체를 parameter로 설정

interface ApplePredicate {

    boolean test(Apple a);

}

[step 2] 원하는 조건을 넣어 interface를 구현(implements)하여 클래스 정의

static class AppleRedAndHeavyPredicate implements ApplePredicate {

    @Override

    public boolean test(Apple apple) {

      return apple.getColor() == Color.RED && apple.getWeight() > 150;

    }

}

[step 3] 메서드 사용시 parameter로 구현된 class를 new 로 생성

List<Apple> redAndHeavyApples = filter(inventory, new AppleRedAndHeavyPredicate());

 

=> 이렇게 되면 step2와 같이 로직과 상관없는 소스들이 많아질 수 있다.   

      then, JAVA는 익명클래스를 제공

 

익명클래스 : 클래스의 선언과 인스턴스화를 동시에 수행.

 

익명 클래스를 사용하면 step2step3 단계를 합칠 수 있다.

List<Apple> redAndHeavyApples = filter(inventory, new ApplePredicate() {

    public boolean test(Apple apple) {

        return apple.getColor() == Color.RED && apple.getWeight() > 150;

    }

});

      

가독성이 떨어진다.. 이 부분을 람다로 해결 가능

List<Apple> redAndHeavyApples = 

                        filter(inventory, (Apple apple) -> apple.getColor() == Color.RED && apple.getWeight() > 150 );

 

# chapter 3. 람다 표현식

 

why use)) 동작 파라미터를 이용할 때 익명 클래스 등 판에 박힌 코드를 구현할 필요가 없다.

 

ex1) 커스텀 Comparator 객체

Comparater<Apple> nyWeight = new Comparator<Apple>() {

      public int comparator(Apple a1, Apple a2) {

             ruturn a1.getWeight().comparator(a2.getWeight());

      }

};

 

ex2) 람다 표현식       

Comparater<Apple> nyWeight = (Apple a1, Apple a2) ->  a1.getWeight().comparator(a2.getWeight());

 

    -. (Apple a1, Apple a2)                      : 람다 파라미더

    -. ->                                        : 화살표

    -. a1.getWeight().comparator(a2.getWeight()) : 람다바디

 

함수형 인터페이스 란) 정확히 하나의 추상메서드를 지정하느 인터페이스다.