동적 파라미터화란 아직은 어떻게 실행할 것인지 결정하지 않은 코드 블록을 의미한다. 이 코드 블록은 나중에 프로그램에서 호출한다.
예를 들어 메서드의 인수로 코드 블록을 전달할 수 있다. 결과적으로 코드 블록에 따라 동작이 파라미터화 된다.
동적 파라미터화의 주요 목적은 변화하는 요구사항에 효율적으로 대응하기 위함이다.
유사한 요구사항에 대응하다 보면 거의 비슷한 코드를 가진 메소드가 여러 개 만들어 질 수 있다.
이렇게 구현 하면, 로직을 고쳐서 성능을 개선하려 할 경우 한줄이 아니라 불필요하게 많은 코드를 수정해야 한다. 이럴 때 해당 메소드를 추상화하면 코드 중복을 줄이고 여러 요구사항에 대응할 수 있다.
특정 알고리즘을 캡슐화 하여 변화하는 요구사항에 유연하게 대응할 수 있다.
인터페이스를 정의해서 그것의 구현체를 메소드의 파라미터로 전달하는 방식이다.
다음은 인터페이스를 활용한 동적 파라미터 예시 코드이다.
아래와 같은 Apple 클래스가 있을 때,
// 단순하게 이름과 무게를 저장하는 Apple 클래스
public class Apple {
public final int weight;
public final String color;
public Apple(int weight, String color) {
this.weight = weight;
this.color = color;
}
}
문자열을 만들어 반환하는 인터페이스를 정의했다.
public interface AppleFormatter {
String makeString(Apple a);
}
다음은 인터페이스의 두가지 구현체이다.
이렇게 프로그래밍 하면 비슷한 성격의 알고리즘을 캡슐화하여 파라미터로 전달 가능하다.
public class AppleInfoFormat implements AppleFormatter {
// Apple 의 정보가 담긴 문자열을 반환
@Override
public String makeString(Apple a) {
return "%d".formatted(a.weight)
+ " 그램인 "
+ "%s".formatted(a.color)
+ " 사과.";
}
}
public class AppleWeightFormat implements AppleFormatter {
// Apple 의 무게에 따라 다른 문자열 반환
@Override
public String makeString(Apple a) {
String result =
"사과가 "
+ "%d".formatted(a.weight)
+ " 그램으로 ";
if (a.weight > 150) {
return result + "무겁습니다";
}
return result + "가볍습니다";
}
}
아래 메서드 prettyPrintApple
는 AppleFormatter
라는 인터페이스를 파라미터로 전달받고, 그것의 makeString
메소드를 호출한다.
public class PrintApple {
public static void main(String[] args) {
// Apple 리스트 만들기
List<Apple> inventory = new ArrayList<>();
inventory.add(new Apple(200, "red"));
inventory.add(new Apple(50, "blue"));
inventory.add(new Apple(150, "orange"));
inventory.add(new Apple(1000, "yellow"));
prettyPrintApple(inventory, new AppleInfoFormat());
System.out.println();
prettyPrintApple(inventory, new AppleWeightFormat());
}
// 동적 파라미터화
public static void prettyPrintApple(List<Apple> inventory, AppleFormatter appleFormatter) {
for(Apple apple: inventory) {
String output = appleFormatter.makeString(apple);
System.out.println(output);
}
}
}
200 그램인 red 사과.
50 그램인 blue 사과.
150 그램인 orange 사과.
1000 그램인 yellow 사과.
사과가 200 그램으로 무겁습니다
사과가 50 그램으로 가볍습니다
사과가 150 그램으로 가볍습니다
사과가 1000 그램으로 무겁습니다
이를 전략 디자인 패턴이라고 한다. 각 알고리즘(전략) 을 캡슐화하여 알고리즘 집합(AppleFormatter)을 정의해둔 다음 런타임에 알고리즘을 선택하는 기법이다.