동작 파라미터화

주리링·2022년 4월 25일
0

모던 자바 인 액션

목록 보기
1/3
post-thumbnail

모던 자바 인 액션 2장 동작 파라미터화를 읽고 정리한 내용입니다.

동작 파라미터화란?
중복되는 코드를 방지하기 위해 동작, 즉 행위를 추상화한 것이라고 할 수 있다.
이해를 위해 아래 예시를 보자.

아래와 같이 색이 GREEN인 사과를 추출한다고 하자.

public 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;
}

만약 다른 색으로 사과를 추출하고 싶다면 어떻게 해야할까?
조건 내의 값을 파라미터화 하여 해당 값을 추상화 할 수 있다.

하지만, 색이 아닌 다른 조건으로 사과를 추출하고 싶다면 어떻게 해야할까?

요구 사항은 언제든 변할 수 있기 때문에, 위와 같은 필터 메서드를 조건마다 사용할 경우 중복이 발생한다.
그렇다면 요구 사항이 매번 변화할 때, 중복을 없애기 위해서 위의 메서드를 바라보면 추출 조건 부분 외에는 코드가 모두 같을 것이라는걸 알 수 있다.

그래서 아래와 같이 추출 조건에 해당하는 동작을 추상화 할 수 있다.
이를 동작 파라미터화 라고 한다.

public List<Apple> filterGreenApples(List<Apple> inventory, Predicate<Apple> p) {
	List<Apple> result = new ArrayList<>();
	for (Apple apple : inventory) {
		**if (p.test(apple)) { //추출 조건**
			result.add(apple);
		}
	}
	return result;
}

동작 파라미터화 방법

  1. 클래스(인터페이스)
public interface ApplePredicate { // Predicate custom
	boolean test (Apple apple);
}

public class AppleGreenColorPredicate implements ApplePredicate {
	public boolean test(Apple apple) {
		return GREEN.equals(apple.getColor);
	}
}
  1. 익명 클래스
filterApples(inventory, new ApplePredicate() {
	public boolean test(Apple apple) {
		return RED.equals(apple.getColor());
	}
});
  1. 람다
filterApples(inventory, (Apple apple) -> RED.equals(apple.getColor()));
profile
코딩하는 감자

0개의 댓글