동적 파라미터화

2023. 1. 10. 21:15·자바

모던 자바 인 액션 정리본

 

동적 파라미터화란?

동적 파라미터화란 메서드가 다양한 동작을 받아서 내부적으로 다양한 동작을 수행할 수 있다.

책에선 이렇게 쓰여있다.

이를 해석하자면 함수의 파라미터로 들어온 인자가 변수뿐만 아니라 메서드로 들어와 함수 내에서 다양한 동작 즉, 인자로 들어온 메서드를 수행할 수 있다.라고 해석할 수 있다.

 

ApplePredicate를 이용한 필터 메서드를 통해 동적 파라미터를 어떻게 동작시키는지 알아보자.

  public static List<Apple> filter(List<Apple> inventory, ApplePredicate p) {
    List<Apple> result = new ArrayList<>();
    for (Apple apple : inventory) {
      if (p.test(apple)) {
        result.add(apple);
      }
    }
    return result;
  }

첫 번째 방법

Interface ApplePredicate

  interface ApplePredicate {

    boolean test(Apple a);

  }

  static class AppleWeightPredicate implements ApplePredicate {

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

  }

  static class AppleColorPredicate implements ApplePredicate {

    @Override
    public boolean test(Apple apple) {
      return apple.getColor() == Color.GREEN;
    }

  }

  static class AppleRedAndHeavyPredicate implements ApplePredicate {

    @Override
    public boolean test(Apple apple) {
      return apple.getColor() == Color.RED && apple.getWeight() > 150;
    }

  }

ApplePredicate를 이용한 필터 메서드를 보게 되면 인자로 Interface인 ApplePredicate가 들어가게 된다.

따라서 ApplePredicate interface를 구현하여 사용자가 원하는 test method를 클래스 인자로 넘겨줄 수 있다.

이를 통해 동적 파라미터를 수행할 수 있다.

 

두 번째 방법

첫 번째 방법을 통해 동적 파라미터를 수행할 수 있었다.

하지만 인터페이스를 만든 뒤 인터페이스 상속한 클래스를 만들어 override 메서드까지 작성하는 것은 굉장히 귀찮은 일이다.

따라서 이번 방법은 익명 클래스를 통해 동적 파라미터를 수행하려 한다.

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

위와 같이 익명 클래스를 사용하여 단축할 수 있다.

하지만 이런 익명 클래스를 사용할 때도 단점이 존재한다.

첫 번째, 여전히 많은 공간은 차지한다.

두 번째, 익명 클래스 사용에 익숙하지 않아 사람들이 읽기에 좋지 않은 코드 일 수 있다.

 

세 번째 방법

람다 표현식을 사용하면 동적 파라미터를 수행할 수 있다.

List<Apple> result = filterApples(List<Apple> inventory, (Apple apple) -> RED.equals(apple.getColor());

 

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

또한 변하는 요구사항에 더 잘 대응할 수 있는 코드를 구현할 수 있다.

 

'자바' 카테고리의 다른 글

동시성 제어하기  (0) 2023.10.05
스트림  (0) 2023.01.27
JVM이란  (0) 2023.01.16
람다 표현식  (1) 2023.01.11
Java List 와 배열  (1) 2023.01.03
'자바' 카테고리의 다른 글
  • 스트림
  • JVM이란
  • 람다 표현식
  • Java List 와 배열
Viper1
Viper1
  • Viper1
    생각의 흐름
    Viper1
  • 전체
    오늘
    어제
    • 분류 전체보기 (69)
      • 문제풀이 (40)
        • 백준 (25)
        • 프로그래머스 (15)
      • 딥러닝 공부 (6)
      • 스프링 (8)
      • 자바 (9)
      • DevOps (2)
      • DB (4)
      • 회고 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Viper1
동적 파라미터화
상단으로

티스토리툴바