동작 파라미터화 를 이용하면 자주 바뀌는 요구사항에 효과적으로 대응할 수 있다.

이는 아직은 어떻게 실행할 것인지 결정하지 않은 코드 블록을 의미한다. 이 코드 블록은 나중에 프로그램에서 호출한다. 즉, 코드 블록의 실행은 나중으로 미뤄진다.

동작 파라미터화를 추가하려면 쓸데없는 코드가 늘어나게 되는데, 이는 람다 표현식으로 해결한다.


2.1 변화하는 요구사항에 대응하기

2.1.1 첫 번째 시도: 녹색 사과 필터링

enum Color { RED, GREEN }
public static List<Apple> filterGreenApples(List<Apple> inventory) {
	List<Apple> result = new ArrayList<>(); // 사과 누적 리스트
	for (Apple apple: inventory) {
		if (GREEN.equals(apple.getColor()) { // 녹색 사과만 선택
				result.add(apple);
		}
	}
	return result;
}

2.1.2 두 번째 시도: 색을 파라미터화

색을 파라미터화할 수 있도록 메서드에 파라미터를 추가하면 변화하는 요구사항에 유연하게 대응할 수 있을 것이다.

public static List<Apple> filterApplesByColor(List<Apple> inventory, Color color) {
	List<Apple> result = new ArrayList<>(); 
	for (Apple apple: inventory) {
		if (apple.getColor().equals(color)) { 
				result.add(apple);
		}
	}
	return result;
}

여기서 ‘색 이외에도 사과를 무게로도 구분하면 좋겠다’라는 요구사항이 생긴다면? → 무게 파라미터를 추가하면 된다.

public static List<Apple> filterApplesByWeight(List<Apple> inventory, int weight) {
	List<Apple> result = new ArrayList<>(); 
	for (Apple apple: inventory) {
		if (apple.getWeight() > weight) { 
				result.add(apple);
		}
	}
	return result;
}

필터링을 적용하는 부분의 코드가 중복되는 것을 알 수 있는데, 이는 DRY 원칙을 어기는 것이다. 어떤 것을 기준으로 필터링할지 가리키는 플래그를 추가하여 이를 해결할 수 있다.