본문 바로가기

IT/자바

Chapter2 동작 파라미터화 코드 전달하기

반응형

변화하는 요구사항에 대응하기 위해 단순히 파라미터를 추가하지 않고 동작 파라미터화를 이용하여 유연하게 대응할 수 있다.

 

동적 파라미터화란,

메서드가 다양한 동작(전략)을 받아서 내부적으로 다양한 동작을 수행할 수 있음을 의미함.

 

강점 : 한 메서드가 다른 동작을 수행하도록 재활용할 수 있음.

 

[코드 개선하기]

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