모던자바인액션

챕터[2] 동작 파라미터화

JeonInwoo 2020. 10. 21. 15:55

제너릭이란 클래스에서 사용할 타입을 클래스 외부에서 선택하여 사용한다.

제네릭 타입은 참조형 타입만 가능하다 (기본형 사용 불가능)

  ->Wrapper Class 사용


동작 파라미터화란?

자주 바뀌는 요구사항에 효과적으로 대응할 수 있는 방법으로 아직은 어떻게 실행할 것인지 결정화지 않은 코드 블럭을 의미한다.

 

동작 파라미터화

변화는 요구사항에 대응하기 위하여 기존에는 메서드를 제작하여 구현하였다. 아래와 같이 2가지의 일을 하는 2개의 메서드를 구현하여 판단했다.

  -> 사과의 색이 빨간색인 사과만 거르는 필터링 메서드

  -> 사과의 색이 초록색인 사과만 거르는 필터링 메서드

 

매 요구사항마다 메서드가 하나씩 생길 수 있는 반면 동작 파라미터화를 이용하여 참 또는 거짓만 반환하는 함수인 프리디케이트를 정의해보자.

 

 

아래의 예제코드와 같이 ApplePredicate를 정의하여 요구사항에 맞게 test 메서드를 다른 방식으로 동작 시킨 것 이다.

그 외 두개의 동작을 동시에 구현한 프리디케이트도 정의할 수 있다.

코드 github.com/hodolee246/ModernJavaStudy/blob/master/src/test/java/com/example/modernjava/ch2/ch2Predicate.java

public interface ApplePredicate {
    boolean test (Apple apple);
}

public class AppleColorPredicate implements ApplePredicate {
    @Override
    public boolean test(Apple apple) {
        return "GREEN".equals(apple.getColor());
    }
}

public class AppleHeavyWeightPredicate implements ApplePredicate {
    @Override
    public boolean test(Apple apple) {
        return apple.getWeight() > 150;
    }
}

반면 이러한 방식으로 생기는 코드도 여러 클래스를 정의 하여 인스턴스화 하며 많은 코드량을 발생시키는데 이 문제점을 개선하는 방법으로는 익명 클래스 라는 기법을 제공한다. 

 

익명클래스 : 자바의 지역 클래스 와 비슷한 개념으로 이름이 없는 클래스이다. 익명 클래스를 이용 시 클래스 선언과 인스턴스화를 동시에 할 수 있다. (아래 예제와 같이 즉석에서 구현하여 만들고 사용할 수 있다.)

public List<Apple> inventory = Arrays.asList(new Apple(150, Apple.Color.GREEN),
                                              new Apple(110, Apple.Color.GREEN),
                                              new Apple(170, Apple.Color.RED));

List<Apple> redApples = filterApples(inventory, new ApplePredicate() {
  @Override
  public boolean test(Apple apple) {
  	return Apple.Color.RED.equals(apple.getColor());
  }
});

람다 : 반면 익명클래스 만으로도 공간이 너무 많이 사용되고 있어서 결국에는 이걸 보완하기 위하여 자바8부터 도입된 방법으로 아래 예제와 같이 구현할 수 있다.

public List<Apple> inventory = Arrays.asList(new Apple(150, Apple.Color.GREEN),
                                                new Apple(110, Apple.Color.GREEN),
                                                new Apple(170, Apple.Color.RED));
                                                
List<Apple> result = filterApples(inventory, (Apple apple) -> Apple.Color.RED.equals(apple.getColor()));

그나마 github : github.com/hodolee246/ModernJavaStudygithub.com/hodolee246/ModernJavaStudy/blob/master/src/main/java/com/example/modernjava/ch2/ExamPredicate.java