모던 자바 인 액션 정리본
동적 파라미터화란?
동적 파라미터화란 메서드가 다양한 동작을 받아서 내부적으로 다양한 동작을 수행할 수 있다.
책에선 이렇게 쓰여있다.
이를 해석하자면 함수의 파라미터로 들어온 인자가 변수뿐만 아니라 메서드로 들어와 함수 내에서 다양한 동작 즉, 인자로 들어온 메서드를 수행할 수 있다.라고 해석할 수 있다.
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 |