Book

[모던 자바 인 액션] 2장. 동작 파라미터화

Jordy-torvalds 2021. 9. 28. 16:03
반응형

간단한 예시를 통해 동작 파라미터화가 왜 필요하고 어떻게 코드 개선될 수 있는지 보자.

Niniz 객체를 담고 있는 리스트에서 원하는 니니즈를 찾는 프로그램을 개발한다고 가정하겠다.

Niniz 클래스는 아래와 같다.

/* Niniz.java */
public class Niniz {
    private String name;

    private String color;

    private String classification;

    public Niniz(String name, String color, String classification) {
        this.name = name;
        this.color = color;
        this.classification = classification;
    }

    public String getName() {
        return name;
    }

    public String getColor() {
        return color;
    }

    public String getClassification() {
        return classification;
    }
}

자바 8 이전에는 Ninizs 리스트에서 초록색인 Niniz를 찾으려면 아래와 같이 했을 것이다.

간단한 로직이여서 한눈에 이해가 되지만, 실제 비즈니스 로직이면 훨씬 복잡했을 것이다.

/* Main.java */
public class Main {

    public static void main(String[] args) {
        List<Niniz> ninizs = init();

        List<Niniz> result = new ArrayList<>();
        for(Niniz niniz : ninizs) {
            if(niniz.getColor().equals("초록색")) {
                result.add(niniz);
            }
        }
    }

    private static List<Niniz> init() {
        return asList(new Niniz("죠르디", "초록색", "파충류")
            , new Niniz("스카피", "분홍색", "포유류")
            , new Niniz("앙몬드", "흰색", "포유류"));
    }
}

위 로직을 스트림과 동작 파리미터 화를 사용하면 아래와 같이 개선이 가능하다.

public class Main {

    public static void main(String[] args) {
        List<Niniz> ninizs = init();

        List<Niniz> result = ninizs.stream()
                .filter(niniz -> niniz.getColor().equals("초록색"))
                .collect(toList());
    }

    private static List<Niniz> init() {
        return asList(new Niniz("죠르디", "초록색", "파충류")
            , new Niniz("스카피", "분홍색", "포유류")
            , new Niniz("앙몬드", "흰색", "포유류"));
    }
}

좀더 짧고 간결해진 것을 알 수 있는데, 대략적인 내용은 초록색인 니니즈를 필터하고 이를 리스트로 변환해 반환하는 코드이다.

앞선 내용에서 스트림은 출력이 곧 입력될 수 있다는 내용이 있는데, 포유류인 니니즈를 필터를 한 후에 흰색인 니니즈를 찾아보도록 하겠다.

public class Main {

    public static void main(String[] args) {
        List<Niniz> ninizs = init();

        List<Niniz> result = ninizs.stream()
                .filter(niniz -> niniz.getClassification().equals("포유류"))
                .filter(niniz -> niniz.getColor().equals("흰색"))
                .collect(toList());
    }

    private static List<Niniz> init() {
        return asList(new Niniz("죠르디", "초록색", "파충류")
            , new Niniz("스카피", "분홍색", "포유류")
            , new Niniz("앙몬드", "흰색", "포유류"));
    }
}

filter 메소드에 들어가는 로직을 참조 객체로 선언하고 이를 할당하는 것 또한 가능하다.

public class Main {

    private static Predicate<Niniz> mammalFilter = niniz -> niniz.getClassification().equals("포유류");
    private static Predicate<Niniz> whiteFilter = niniz -> niniz.getClassification().equals("포유류");

    public static void main(String[] args) {
        List<Niniz> ninizs = init();

        List<Niniz> result = ninizs.stream()
                .filter(mammalFilter.and(whiteFilter))
                .collect(Collectors.toList());
    }

    private static List<Niniz> init() {
        return asList(new Niniz("죠르디", "초록색", "파충류")
                , new Niniz("스카피", "분홍색", "포유류")
                , new Niniz("앙몬드", "흰색", "포유류"));
    }
}
반응형