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 에 대해서 알아보겠습니다.

도움이 되셨다면 공감을 눌러주세요.

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기