0%

(학습) Java8 In Action 2장 정리

Java8 in Action 책을 보고 학습한 내용을 정리한 포스팅이다.
직접 실행해보거나 작성해본 코드는 Github에 작성하였다.
1장 포스팅


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


동작 파라미터화 (Behavior Parameterization)

  • 아직 어떻게 실행할 것인지 결정하지 않은 코드 블록을 의미
  • 변화하는 요구사항에 유연하게 대응하기 위해 사용한다.
  • 기존 자바에서 메서드는 객체만 인수로 받으므로 동작을 전달하기 위해서는 메서드에 인터페이스를 파라미터로 받도록 선언하고 이를 구현한 객체를 전달하거나 익명 클래스를 통해 전달하기도 한다.
  • 아래는 위의 설명에 대한 샘플 코드이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// 기존의 메서드 형태
public boolean onlyParamater(int appleWeight, int compareWeight) {
return appleWeight > compareWeight ? true : false;
}

/////// Apple 정보를 담는 클래스
class Apple {
private int weight;
private String color;
public Apple(int weight, String color) {
this.weight = weight;
this.color = color;
}
///Getter, Setter
}

/////// Apple 정보에 대해 참거짓을 반환하는 프레디케이트 인터페이스
interface ApplePredicate { boolean test(Apple apple); }

/////// 프레디케이트를 구현한 클래스
class AppleHeavyWeightPredicate implements ApplePredicate {
public boolean test(Apple apple) {
return "green".equals(apple.getColor());
}
}

/////// 동작 전달을 위한 인터페이스 파라미터를 받는 메서드
class AppleUtil {
public static List<Apple> filterApples(List<Apple> inventory, ApplePredicate p) {
List<Apple> result = new ArrayList<>();
for (Apple apple : inventory) {
if (p.test(apple)) {
result.add(apple);
}
}
return result;
}
}

//////// 동작 파라메터
public class ShowAppleItem {
public static void main(String []args) {
List<Apple> inventory = Arrays.asList(new Apple(80, "green"), new Apple(155, "green"), new Apple(120, "red"));
List<Apple> result = AppleUtil.filterApples(inventory, new AppleHeavyWeightPredicate());
}
}
  • 위 코드를 보면동작의 핵심 이외의 장황한 코드가 필연적이므로 구현하고 유지보수하는 데 어려움이 많은 문제점이 있다.
  • 익명 클래스도 사용할 수 있지만 코드의 장황함(Verbosity)이 발생한다.
  • 이를 위해서 람다 표현식을 통해 해결이 가능하다.