JAVA8 : 동작 파라미터화 전달하기
동작 파라미터화 (behavior parameterization) 이란?
아직은 어떻게 실행할 것인지 결정이 되지 않은 코드 블럭을 말합니다.
동작 파라미터화는 자주 바뀌는 요구사항에 유연하게 대응하고
새롭게 추가된 기능은 쉽게 구현 할 수 있도록 할 수 있다는 점에서 장기적인 관점에서 효과적입니다.
동작 파라미터의 필요성을 위해 아래 예제를 살펴 보겠습니다.
먼저 String, int, boolean 등의 값을 파라미터화 하겠습니다.
public static List<Car> filterCars(List<Car> cars, String color, String carType, boolean flag){ List<Car> carlist = new ArrayList<>(); //Car List for(Car car: cars){ if(color.equals(car.getColor()) && carType.equals(car.getCarType()) && flag){ // carlist.add(car); } } return carlist; }
어떠신가요 ? 요구사항이 바뀌었을 때 유연하게 대처할 수 있을까요?
더 많은 조건이 추가 된다면 마찬가지로 여러 중복 필터 메서드, 파라미터를 만들어야 합니다.
더군다나 파라미터가 잘 정의되지 않는 상황이 발생 할 수도 있죠.
그래서 filterCars 의 동작을 파라미터화 해보겠습니다.
먼저 조건을 결정하는 인터페이스를 정의합니다.
public interface CarPredicate { boolean test(Car car); }
그리고 정의한 인터페이스를 이용해 다른 CarPredicate 를 정의 할 수 있습니다.
public class CarTypePredicate implements CarPredicate{ public boolean test(Car car) { return car.getCarType().equals("suv"); } } public class CarColorPredicate implements CarPredicate{ public boolean test(Car car) { return car.getColor().equals("black"); } }
이제 CarPredicate 를 넘겨 test 에 해당되는 Car 리스트를 리턴 받는 메소를 만든다.
public static List<Car> filterCars(List<Car> cars, CarPredicate p){ List<Car> carlist = new ArrayList<>(); //Car List for(Car car: cars){ if(p.test(car)){ // carlist.add(car); } } return carlist; }
filterCars 의 메서드의 동작을 이렇게 파라미터 한 것입니다.
컬렉션 탐색 로직과 각 항목에 적용할 동작을 분리 할 수 있다는 것이 동작 파라미터의 강점 입니다.
유연한 API 를 위해 동작 파라미터화는 반드시 필요합니다.
이제 람다(Lambda Expressions) 를 사용하여 더 간단하게 구현해보겠습니다.
먼저 람다에 대해 간단히 정의하면
식별자 없이 실행 가능한 함수 표현식
사용 예제는 아래와 같습니다.
( parameters ) -> expression body ( parameters ) -> { expression body } () -> { expression body } () -> expression body ...
그럼 이제 람다를 이용해서 구현해보겠습니다.
@FunctionalInterface public interface CarPredicate<T>{ boolean test(T t); }
public static <T> List<T> filterCars(List<T> list, CarPredicate<T> p){ List<T> carlist = new ArrayList<>(); //Car List for(T e: list){ if(p.test(e)){ carlist.add(e); } } return carlist; }
List<Car> carlist = filterCars(list, (Car car)->"black".equals(car.getColor()));
코드가 훨씬 간단해졌습니다..
유연하고 간결한 코드가 된거죠.
이렇게 동작 파라미터화를 이용하면 요구사항에 더 유연하게 대응 할 수 있는 코드를 구현 할 수 있습니다.
다음에는 Java 8 의 Lambda 에 대해서 알아보겠습니다.
도움이 되셨다면 공감♥을 눌러주세요.