1. Question

동작 파라미터화(Behavior Parameterization)란 무엇인가?

2. Answer

동작 파라미터화Java와 같은 프로그래밍 언어에서 유용한 디자인 패턴 중 하나로, 함수 또는 작업을 메서드에 전달하는 개념이다. 이를 통해 코드의 재사용성과 유연성을 높일 수 있다. 동작 파라미터화는 함수적 인터페이스람다 표현식을 사용하여 구현되며, 이를 통해 동적으로 다양한 동작을 메서드에 전달할 수 있다. 이러한 기능은 코드를 더 추상화하고 다양한 상황에 대처할 수 있게 해주어, 유지보수성을 향상시키고 코드의 재사용성을 높인다.

3. Detail

A. 사용 방법

  • 인터페이스 정의: 동작을 나타내는 함수적 인터페이스를 먼저 정의한다. 이 함수적 인터페이스는 주로 하나의 추상 메서드만을 가지며, 동작의 시그니처를 정의한다. (프레디케이트(Predicate): 참 또는 거짓을 반환하는 함수)
public interface Predicate<T> {
  boolean test(T t);
}
  • 메서드 작성: 동작을 받아들이는 메서드를 작성한다. 이 메서드는 함수적 인터페이스를 파라미터로 받아서 해당 동작을 실행하고, 조건에 따라 결과를 반환한다.
public static <T> List<T> filter(List<T> list, Predicate<T> p) {
  List<T> result = new ArrayList<>();
  for(T e: list) {
    if(p.test(e)) {
      result.add(e);
    }
  }
  return result;
}
  • 사용: 이제 동작 파라미터화를 사용하여 필터링 조건을 정의하고 메서드에 전달할 수 있다. 이는 람다 표현식을 활용하여 간결하게 동작을 표현할 수 있다.
List<Apple> redApples = filter(inventory, (Apple apple) -> RED.equals(apple.getColor()));

List<Integer> evenNumbers = filter(numbers, (Integer i) -> i % 2 == 0);

B. 장점

  • 코드 재사용성 향상: 동작 파라미터화를 사용하면, 동일한 메서드를 다양한 동작과 조건에 대해 재사용할 수 있다. 이는 코드를 더 효율적으로 작성하고 유지보수하기 쉽게 만든다.

  • 유연성: 동작 파라미터화를 통해 애플리케이션의 동작을 동적으로 변경할 수 있다. 이는 다양한 시나리오에 대응하는 유연한 솔루션을 제공한다.

  • 가독성 향상: 람다 표현식을 사용하면 코드가 더 간결해지고 가독성이 향상된다. 람다를 통해 동작을 직관적으로 표현할 수 있다.

  • 테스트 용이성: 동작 파라미터화를 사용하면, 메서드의 동작을 단위 테스트하기 쉽다. 다양한 동작을 주입하여 각각의 동작에 대한 테스트를 수행할 수 있다.

C. 실전 예제

  • Comparator로 정렬하기
// java.util.Comparator
public interface(Comparator<T>) {
  int compare(T o1, T o2);
}

// 자바 8의 List에는 sort 메서드가 포함되어 있다. (sort의 동작을 파라미터화)
inventory.sort((Apple a1, Apple a2) -> al.getWeight().compareTo(a2.getWeight()));
  • Runnable로 코드 블록 실행하기
// java.lang.Runnable
public interface Runnable {
  void run();
}

// 자바에서는 Runnable 인터페이스를 이용해서 실행할 코드 블록을 지정할 수 있다.
Thread t = new Thread(() -> System.out.println("Hello world"));
  • Callable을 결과로 반환하기
// java.util.concurrent.Callable
public interface Callable<V> {
  V call();
}

// 결과를 반환하는 태스크를 만든다. (태스크를 실행하는 스레드의 이름을 반환한다.)
Future<String> threadName = executorService.submit(() -> Thread.currentThread().getName());
  • GUI 이벤트 처리하기
Button button = new Button("Send");
// EventHandler는 setOnAction 메서드의 동작을 파라미터화한다.
button.setOnAction((ActionEvent event) -> label.setText("Sent!!"));

4. Reference

  • “모던 자바 인 액션” (저자: 라울-게이브리얼 우르마, 마리오 푸스코, 앨런 마이크로프트)

태그:

카테고리:

업데이트:

댓글남기기