[모던자바 인액션]#2 동작 파라미터화 코드 전달
# 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는 익명클래스를 제공
익명클래스 : 클래스의 선언과 인스턴스화를 동시에 수행.
익명 클래스를 사용하면 step2 와 step3 단계를 합칠 수 있다.
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()) : 람다바디
함수형 인터페이스 란) 정확히 하나의 추상메서드를 지정하느 인터페이스다.