notepad

CHAPTER 2. 동작 파라미터화 코드 전달하기 본문

JAVA/모던자바인액션

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

likewise_ 2020. 5. 28. 14:53

해당 포스팅은 '모던 자바 인 액션'(라울-게이브리얼 우르마 외 2인 저) 책의 내용을 학습을 위해 정리한 내용입니다.

Goal

동작 파라미터화가 무엇인지 알아보자.

키워드

동작 파라미터란?

아직은 어떻게 실행할 것인지 결정하지 않은 코드블록을, 나중에 실행 될 메서드의 인수로 전달하는것.
동작을 담은 코드를 메서드 인자로 전달하는것


  • 사용자의 요구사항은 계속 변한다.
  • 추가된 요구사항을 처리하는 위해 우리는 계속해서 같은 코드 블록을 복사, 붙여넣기 하고 불필요한 코드를 작성하고, 코드는 점점 지저분하게 된다.
  • 동작파라미터화 & 람다 사용을 통해 중복된 코드는 제거하고, 복잡한 과정은 제거하자.

동작 파라미터화 / 추상화가 필요한 상황

  • 농장 재고 목록 어플리케이션에 리스트에 “녹색 사과” 만 필터링 하는 기능을 추가한다고 가정하자
    : 녹색 사과 필터링 기능 구현
  • “녹색 사과”를 필터링 하는 기능 구현을 하고 나니 “빨간 사과” 도 필터링 하고 싶다고 한다
    : 빨간 사과도 필터링 가능하도록 ‘색상’을 파라미터화
  • ‘색상’을 인자로 받도록 수정하고 나니 무게가 150g 이상인 사과를 필터링 하고싶다고 한다
    : 색상 필터링 메서드를 복사하여 파라미터를 무게로 변경하여 사용(중복코드발생)
  • 색상은 빨강이면서 무게는 150 이상인 사과를 필터링 하고 싶다고 한다.
    : 가능한 모든 속성으로 필터링 하도록 기능 변경 -> 복잡한 코드 발생

메서드를 인자로 전달하려면 어떡해아할까?

  • 공통된 부분을 추상화 하여 객체를 인자로 전달
    : 매 번 클래스를 만들어줘야한다.
  • 익명 클래스를 구현하여 인자로 전달
    : 불필요한 코드는 계속해서 존재한다.
  • 람다를 사용 : 복잡한 과정 간소화.
    : GOOD !

1. 공통된 부분을 추상화 하여 객체를 인자로 전달 / 동작 파라미터화

  • 선택 조건을 결정하는 인터페이스 정의 (프레디게이트)
interface ApplePredicate{
    boolean test(Apple apple);
}
  • 추상적 조건으로 필터 클래스 추가
class AppleColorGreenFilter implements ApplePredicate{
    @Override
    public boolean test(Apple apple) {
        return GREEN == apple.getColor();
    }
}

class AppleWeightHeavyFilter implements ApplePredicate{
    @Override
    public boolean test(Apple apple) {
        return apple.getWeight() > 150;
    }
}
  • 추상적 조건으로 필터링
private List<Apple> filterColorAndWeightApple(List<Apple> inventory, ApplePredicate p) {
    List<Apple> apples = new ArrayList<>();
    for (Apple apple:inventory){
        if(p.test(apple)){
            apples.add(apple);
        }
    }
    return apples;
}
  • 코드 전달 (동작 파라미터화)
List<Apple> heavyApple = application.filterColorAndWeightApple(inventory, new AppleWeightHeavyFilter());

List<Apple> greenApple = application.filterColorAndWeightApple(inventory, new AppleColorGreenFilter());

2. 익명 클래스를 구현하여 동작 파라미터화

  • 코드 전달 부분에서 익명 클래스로 인자 전달
List<Apple> heavyApple = application.filterColorAndWeightApple(inventory, new ApplePredicate() {
    @Override
    public boolean test(Apple apple) {
        return GREEN == apple.getColor();
    }
});

3. 람다를 사용하여 동작 파라미터화

  • 람다로 동작 파라미터화 / 복잡한 과정이 간소화된다.
List<Apple> heavyApple = application.filterColorAndWeightApple(inventory,  (Apple apple) -> RED.equals(apple.getColor());

요약

  • 동작 파라미터화에서는 메서드 내부적으로 다양한 동작을 수행할 수 있도록 코드를 메서드 인수로 전달한다.
  • 동작 파라미터화를 이용하면 변화하는 요구사항에 더 잘 대응할 수 있는 코드를 구현할 수 있고, 나중에 엔지니어링 비용을 줄일 수 있다.
Comments