가자공부하러!

모던자바인액션(CH2) - 동작 파라미터화 코드 전달 본문

공부/Java

모던자바인액션(CH2) - 동작 파라미터화 코드 전달

오피스엑소더스 2020. 3. 29. 17:49

https://github.com/HyeongJunMin/ModernJava

 

목차

1. 요약 및 결론

2. 책 내용

3. 동작 파라미터화

4. 프레디케이트

5. 익명클래스

6. Runnable로 코드 블록 실행하기

요약

한 메소드에 각기 다른 동작을 하는 여러 종류의 코드블록을 전달하여 다른 결과를 만들어낼 수 있도록 설계하는 것을 동작 파라미터화 라고 한다.

동작 파라미터화를 통해 보기 좋은 코드를 만들 수 있고, 변화하는 요구사항에 더 유연하게 대처할 수 있다.

 

결론

단순 필터기능이라면 굳이 뭐 상속받고 생성해서 넘기지 말고 stream().filter() 쓰는게 좋을거라고 생각한다.

 

책 내용

1. 요구사항 변화에 대응하는 방법

 - 동작 파라미터화를 이용하면 좋음

2. 동작 파라미터화(Behavior parameterization)

 - 아직은 어떻게 실행할 것인지 결정하지 않은 코드블록을 의미

 - 코드블록의 실행은 나중에 프로그램에서 호출하며 결과적으로 메서드의 동작이 파라미터화 된다.

 - 목적 : 요구사항 변화에 유연한 대처 가능, 클린 코드

3. 익명 클래스

4. 람다 표현식 미리보기

5. 실전 예제 : Comparator, Runnable, GUI

 

동작 파라미터화(behavior parameterization)

한 메소드에 각기 다른 동작을 하는 여러 종류의 코드블록을 전달하여 다른 결과를 만들어낼 수 있도록 설계하는 것

 

프레디케이트(predicate)

참 또는 거짓을 반환하는 함수

 

public interface ApplePredicate {
    boolean test (Apple apple);
}
public class AppleHeavyWeightPredicate implements ApplePredicate {
    public boolean test (Apple apple) {
        return apple.getWeight() >= 150;
    }
}
public class AppleGreenColorPredicate implements ApplePredicate {
    @Override
    public boolean test(Apple apple) {
        return Apple.Colors.GREEN.equals(apple.getColor());
    }
}
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Apple {

    public enum Colors {
        GREEN, RED, BLACK
    }

    private Colors color;
    private Integer weight;

    public static List<Apple> filterApplesCustomPredicate(List<Apple> inventory, ApplePredicate p) {
        List<Apple> result = new ArrayList();
        for (Apple apple : inventory) {
            if (p.test(apple)) {
               result.add(apple);
            }
        }
        return result;
    }

    public static boolean isGreenApple(Apple apple) {
        return Colors.GREEN.equals(apple.getColor());
    }

}
class Ch2BehaviorParamizeTest {

    List<Apple> inventory = new ArrayList();

    @BeforeEach
    void setUp() {
        inventory.add(new Apple(Apple.Colors.RED, 150));
        inventory.add(new Apple(Apple.Colors.GREEN, 100));
        inventory.add(new Apple(Apple.Colors.BLACK, 50));
    }

    @Test
    void predicateTest() {
    	//작성한 필터메소드에 조건에 따라 predicate를 다르게 사용하면 
        //파라미터에 따라 다른 동작을 수행한다
        //아래 코드에서 동작파라미터화에서 말하는 코드블록은 Apple...Predicate()이다
        Apple.filterApplesCustomPredicate(inventory, new AppleGreenColorPredicate());
        Apple.filterApplesCustomPredicate(inventory, new AppleHeavyWeightPredicate());
        
        //predicate 굳이 안하고 람다로 하는게 좋을듯
        Apple.filterApples(inventory, apple -> Apple.Colors.RED.equals(apple.getColor()));
    }
}

예제코드 요약그림

 

익명클래스

value 맞추기(인텔리제이가 답 알려줌)

@Test
void pickActualResultTest() {
    MeaningOfThis meaningOfThis = new MeaningOfThis();
    meaningOfThis.doIt();
}

public class MeaningOfThis {
    public final int value = 4;
    public void doIt() {
        int value = 6;

        Runnable r = new Runnable() {
            public final int value = 5;
            public void run() {
                int value = 10;
                System.out.println(this.value);
            }
        };

        r.run();
    }
}

 

Runnable로 코드 블록 실행하기

자바 스레드를 이용하면 병렬로 코드 블록을 실행할 수 있다.

병렬처리는 언제 하는게좋을까... 로그인 트래픽 밀릴 때? 마땅히 떠오르지 않으므로 이런 방법도 있구나 하고 넘어감

@Test
void howToCreateThread() {
    //자바 8 이전
    Thread t = new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("thread made by anonymous class");
        }
    });

    //람다 활용
    t = new Thread(() -> System.out.println("thread made by lambda"));
}

 

추가로 공부할 내용

1. 공유객체란?

2. Runnable과 Callable은 각각 어떤 차별점이 있을까?

Comments