#02장 동작 파라미터화로 코드 넘기기

Raoul-Gabriel Urma 저, 우정은 역 「Modern Java in Action, 2019」를 읽고 정리하였습니다.

요구사항이 계속 변화하면서, 동작 파라미터가 어떤 이점을 주는지 사과 필터링에 대한 예로 설명한다.

Apple.java

package com.company;

public class Apple {
    String Color;
    private int weight;

    public Apple(String color, int weight) {
        Color = color;
        this.weight = weight;
    }

    public String getColor() {
        return Color;
    }

    public void setColor(String color) {
        Color = color;
    }

    public int getWeight() {
        return weight;
    }

    public void setWeight(int weight) {
        this.weight = weight;
    }

    @Override
    public String toString() {
        return "Apple{" +
                "Color='" + Color + '\'' +
                ", weight=" + weight +
                '}';
    }
}

1-1 인벤토리에서 초록색 사과만 가져온다.

인벤토리에는 다양한 무게의 빨간색, 파란색 사과들이 들어가있다.

1-2 인수로 조건을 받아 해당 사과만 가져온다. (파라미터 사용 시작)

위에 코드는 반복된 것이 많아 DRY(don’t repeat yourself principle)를 어긴다.

1-3 중복을 없애보자.

위 코드는 형편없는 코드다. 이렇게 플래그를 이용한다면, 추후에 오는 요구사항들을 모두 반영하기 위해서는 여러 중복된 필터 메서드를 만들거난 모든것을 처리하는 거대한 하나의 필터메서드를 만들어야 된다.

2-1 동작 파라미터화 사용하기.

동작 파라미터를 사용한 전략 디자인 패턴이다. (strategy design pattern) ApplePredicate = 알고리즘 패밀리, AppleGreenColorPredicate = 전략

컬렉션을 반복하는 로직과 컬렉션의 각요소에 적용할 동작을 분리할 수 있게 되었다. (1-3과 비교를 해보면 알 수 있다.)

AppleRedAndHeavyPredicate나 AppleHeavyWeightPredicate 등 자유롭게 필터링 조건을 걸어 filterApples의 매개변수에 인스턴스화하여 이제 유연함을 누릴 수 있게 되었다. 하지만, 한번만 사용할 클래스를 구현해서 인스턴스화하는 과정이 조금은 부담이 될 수 있다. 개선할 방법을 알아보자.

2-2 익명 클래스 사용해보자

한번만 사용할 클래스를 생성하지 않고 익명클래스로 만들었다.

하지만, 익명클래스가 모든것을 해결해 주지 않는다. 가독성이 조금 떨어지기 때문이다.

2-3 람다 사용하기

훨씬 간단해졌다...

3 실전 예제

  • ​실습 해볼 3가지

    • Comparator로 정렬

    • Runnable로 코드 블록 실행

    • GUI 이벤트 처리

3-1 Comparator로 정렬

sort 연산을 파라미터화 해보자.

3-2 Runnable로 코드 블록 실행

3-3-1 Callable를 이용해 결과를 반환

Callable 인터페이스를 이용해 결과를 반환하는 태스크를 만든다. 위 3-2인 스레드와 Runnable을 이용하는 방식과 다르게 태스크를 스레드 풀로 보내고 결과를 future에 저장할 수 있다.

3-3-2 GUI 이벤트 처리

JavaFX에서 사용하는 액션 이벤트

정리

  • 동작 파라미터화 -> 메서드에게 여러 다른 동작들을 파라미터로써 취하고 내부적으로 다른 동작들이 진행되게끔 사용한다.

  • 코드가 요구사항 변화에 더 적응가능해지고 미래의 엔지니어들의 시간을 아낀다.

  • 코드를 넘기는 것은 메서드에게 인수로 새로운 동작을 주는 것이다. 그러나 자바 8 이전에는 너무 장황하였고, 익명 클래스들이 오직 한번만 필요한 인터페이스를 위해 여러 구상클래스(concrete classes)를 선언하는데 장황함을 없애는데 약간의 도움을 주었다

  • 자바 API는 다른동작들로 파라미터화 할 수 있는 많은 메소드(소팅, 쓰레드 그리고 GUI 핸들링)들은 담고 있다.

  • 프로그래머는 동작 파라미터화를 꼭 사용해야 한다!

Last updated