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


우리가 어떤 상황에서 일을 하던 소비자 요구사항은 항상 바뀜.

변화하는 요구사항은 소프트웨어 엔지니어링에서 피할 수 없는 문제.

새로 추가한 기능은 쉽게 구현할 수 있어야 하며 장기적인 관점에서 유지보수가 쉬어야 함.

동작 파라미터화(behavior parameterization)를 이용하면 자주 바뀌는 요구사항에 효과적으로 대응 가능.

동작 파라미터화란 아직 어떻게 실행될 것인지 결정하지 않은 코드 블록을 의미.

이 코드 블록은 나중에 프로그램에서 호출.


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

- 비슷한 코드를 구현한 다음 추상화 하기.

- 소프트웨어 공학의 DRY(don't repeat yourself - 같은 것을 반복하지 말 것) 원칙 준수.

- 어떤 기준으로 필터링할지 가리키는 플래그를 추가하는 개발은 지양.

> 실전에서는 사용하지 말아야 하는 방법!!!

> 해당 기법은 동작 파라미터화로 충분히 해결이 가능함.


아래 예제를 통해서 유연한 코드를 만드는 모범 사례를 전달.

예제에서 사용 될 Apple Class.


첫번째 예제: 녹색 사과 필터링

- 사과 목록 중에서 녹색 사과만 선택.


두번째 예제: 색을 파라미터화

- 다양한 색의 사과를 필터링 해야하는 요구사항이 발생.

- 색이 아닌 무게 기준 필터링의 요구사항 발생.

- 색상 필터 조건이 무게 필터 조건으로만 변경됨.

- 비슷한 코드의 추상화 작업이 필요함.


세번째 예제: 가능한 모든 속성 필터링

- 색 또는 무게 중 어떤 것을 필터링할지 가리키는 플래그를 통한 필터링

- 앞으로 색 & 무게 이외에 다른 기준을 통한 필터링에 대해서는 대처가 불가능한 코드.

- 위와 같이 flag 값을 통해 개발하는 것은 지양하도록 해야함.


2. 동작 파라미터화

- 파라미터를(플래그)를 추가하는 방법이 아닌 변화하는 요구사항에 좀 더 유연하게 대응할수 있는 방법이 절실.

- 전략 디자인 패턴 적용

> 선택 조건을 결정하는 인터페이스 정의(프레디케이트)

> 다양한 선택 조건을 대표하는 여러 버전의 ApplePredicate 정의.

> 전략 디자인 패턴은 각 알고리즘(전략이라 불리는)을 캡슐화하는 알고리즘 패밀리를 정의해준 다음

 런타임에 알고리즘을 선택하는 기법.


네번째: 추상적 조건으로 필터링

- ApplePredicate 인터페이스를 구현한 메서드를 통한 필터 처리.

- 첫번째 코드에 비해 더 유연한 코드로 재 탄생 되었음.

- 전달한 ApplePredicate 객체에 의해 메서드의 동작이 결정됨.

- 필요한 대로 ApplePredicate를 구현하여 메서드로 전달 가능.

- 한 개의 파라미터, 다양한 동작이 가능해짐.


3. 복잡한 과정 간소화

- 자바는 클래스의 선언과 인스턴스화를 동시에 수행할 수 있도록 익명 클래스라는 기법을 제공.

- 익명 클래스를 이용하면 코드의 양을 줄일 수 있음.

> 단, 익명 클래스가 모든 것을 해결하는 것은 아님.


3.1 익명 클래스

- 익명 클래스는 자바의 지역클래스(블록 내부에 선언된 클래스)와 비슷한 개념.

- 말 그대로 이름이 없는 클래스.

- 익명 클래스를 사용하면 클래스 선언과 인스턴스화를 동시에 할 수 있음.


다섯번째 예제: 익명 클래스 사용

- 익명 클래스 역시 많은 여러 Line을 차지함.

- 많은 프로그래머가 익명 클래스 사용에 익숙하지 않는 단점을 지님.


여섯번째 예제: 람다 표현식 사용

- 자바8 람다 표현식을 이용해 다섯번째 예제의 소스를 다음과 같아 간단하게 구현.


일곱번째 예제: 리스트 형식으로 추상화

- 사과 이외에 다양한 Item에 대해 필터링이 작동되도록 리스트 형식을 추상화.


4. 실전 예제

- 동작 파라미터화가 변화하는 요구사항에 쉽게 적응하는 유용한 패턴임을 확인함.

- 동작 파라미터화 패턴은 동작을 (한 조각의 코드로) 캡슐화한 다음 메서드로 전달하여 메서드의 동작을 파라미터화 함.

> 예를 들면 사과의 다양한 Predicate.

- 코드 전달 개념을 다기지 위한 Comparator로 정렬. Runnable로 코드 블록 실행하기 예제 작성.


예제: Comparator로 정렬

예제: Runnable 코드 블록 실행.

- 람다 표현식을 이용한 코드.


5. 요약

- 동작 파라미터화는 메서드 내부적으로 다양한 동작을 수행할 수 있도록 코드를 메서드 인수로 전달.

- 동작 파라미터화를 이용하면 변화하는 요구사항에 더 잘 대응할수 있는 코드 구현 가능.

> 엔지니어링 비용을 줄일 수 있음.

- 코드 전달 기법을 이용하여 동작을 메서드 인수로 전달 가능.

> 하지만 자바8 이전에는 코드를 지저분하게 구현해야 했음.

> 익명 클래스로도 어느 정도 코드를 깔끔하게 만들수 있으나 자바 8에서는 인터페이스를 상속받아

 여러 클래스를 구현해야하는 수고를 없앴수 있는 방법 제공.

- 자바 API이 많은 메서드는 정렬, 스레드, GUI 처리등을 포함한 다양한 동작으로 파라미터화 가능.



'Java8 > Java 8 in Action' 카테고리의 다른 글

스트림 활용  (0) 2017.06.26
스트림 소개  (0) 2017.06.16
람다 표현식  (0) 2017.06.15
동작 파라미터화 예제 소스  (0) 2017.06.13
자바8을 눈여겨봐야 하는 이유  (0) 2017.06.13

+ Recent posts