반응형
변화하는 요구사항에 대응하기 위해 단순히 파라미터를 추가하지 않고 동작 파라미터화를 이용하여 유연하게 대응할 수 있다.
동적 파라미터화란,
메서드가 다양한 동작(전략)을 받아서 내부적으로 다양한 동작을 수행할 수 있음을 의미함.
강점 : 한 메서드가 다른 동작을 수행하도록 재활용할 수 있음.
[코드 개선하기]
1. 메소드 파라미터로 구현한 필터링 코드
public static List<Apple> filterApples(List<Apple> inventory, Color color,
int weight, boolean flag){
List<Apple> result = new ArrayList<>();
for(Apple apple : inventory){
if(flag && apple.getColor().equals(color) ||
(!flag && apple.getWeight() > weight)) {
result.add(apple);
}
}
return result;
}
위의 코드를 동적 파라미터화를 통해 다양한 요구에 대응할 수 있는 코드로 개선시켜보자
2. 한 개의 파라미터, 다양한 동작
public class AppleRedAndHeavyPredicate implements ApplePredicate {
@Override
public boolean test(Apple apple) {
if(apple.getColor().equals(Color.RED) && apple.getWeight() > 150)
return true;
else
return false;
}
}
이처럼 인스턴스화를 통해 동작 파라미터를 구현할 경우 구현하고자 하는 기능에 비해 번거로우며, 시간 낭비가 될 수 있다.
클래스 선언과 인스턴스화를 하기 위한 로직과는 상관없는 코드를 줄이기 위해 익명 클래스 기법을 사용할 수 있다.
3. 익명 클래스
List<Apple> result = new ArrayList<>();
result = filterApples(inventory, new ApplePredicate() {
public boolean test(Apple a) {
return Color.red.equals(a.getColor());
}
});
익명 클래스를 통해 비즈니스 로직 (ApplePredicate)을 파라미터화함으로 소스 코드를 줄일 수 있다.
하지만, 사용법이 익숙하지 않고, 가독성이 떨어짐으로 많이 사용되고 있지 않다.
4. 람다 표현식
람다식은 동작 파라미터화 기법 중 가장 간결하면서 유연함을 얻을 수 있다.
public class Application {
public static void main(String[] args) {
...
List<Apple> result = new ArrayList<>();
result = filter(inventory, (Apple a) -> Color.blue.equals(a.getColor()));
System.out.println(result.size());
}
public static <T> List<T> filter(List<T> list, Predicate<T> p){
List<T> result = new ArrayList<>();
for (T e:list){
if(p.test(e)){
result.add(e);
}
}
return result;
}
}
※ Predicate<T>
Java.util.function 패키지의 함수형 인터페이스 중 1개임
Predicate 인터페이스로 매개변수를 조건에 맞춰 조사한 뒤 boolean 값으로 반환한다.
반응형
'IT > 자바' 카테고리의 다른 글
Chapter6 스트림으로 데이터 수집 (0) | 2020.09.20 |
---|---|
Chapter3 람다 표현식 (0) | 2020.09.07 |
HashMap의 동작 (0) | 2020.07.23 |
가비지 컬렉션에 대한 정리 (0) | 2020.07.23 |
[ORACLE] JOIN _ ON 과 WHERE _ 오라클 조인 (0) | 2020.02.17 |