티스토리 뷰

etc

[JAVA] 동작 파라미터화 코드 전달

tbMaster 2022. 1. 17. 19:28
반응형

모던 자바 인 액션 - 동작파라미터화 코드 전달하기  부분 정리한 내용

 


동작 파라미터화 (behavior parameterization)

: 변화하는 요구사항에 효과적으로 대응하기 위해 사용

 

 

 

예시

 

농부가 첫째날 원한 것 :  특정 무게 이상의 사과만 나열하고 싶어~

개발자 : 

public filterApples(List<Apple> apples, Float weight){
	...
	for(Apple apple : apples){
    	if(apple.getWeight() >= 15){
        	...
        }
    }
	... 
}

농부가 둘째날 원한 것 : 초록 사과만 나열하고 싶어~ 

개발자 : 

public filterApples(List<Apple> apples, String color){
	...
	for(Apple apple : apples){
    	if("GREEN".equals(apple.getColor())){
        	...
        }
    }
	... 
}

농부가 셋째날 원한 것 : 특정 무게 이상, GREEN 사과만 나열하고 싶어~

개발자 : 

public filterApples(List<Apple> apples, Float weight, String color){
	...
	for(Apple apple : apples){
    	if(apple.getWeight() >= 15 && "GREEN".equals(apple.getColor())){
        
        	...
        }
    }
	... 
}

 

 

이렇게 매번 요구사항이 변화할 때마다, 비슷한 동작임에도, 파라미터의 변경으로 인해, 메소드를 새로 만들어야 한다.

이는 코드가 장황해지면서, 가독성이 현저하게 떨어진다.

 

 


 

이러한 경우, 데이터 접근과 동작을 분리하여 생각해야 한다.

그리고 동작을 파라미터로 전달한다면, 데이터 접근 부분은 건들지 않아도 되는 이점이 생긴다.

이렇게 동작을 파라미터화하여 메소드에 제공하는 것을 동작 파라미터화라 한다.

 

 

 

동작파라미터화 방법

공통사항

- 다양한 기능들을 전달할 수 있도록, 기능에 대한 인터페이스를 작성한다. 여기서는 조건에 대한 true/false를 출력하는 Predicate를 이용하였다.

    //Apple 선별 기준 인터페이스
    public interface ApplePredicate {
        boolean test(Apple apple);
    }

 

- 데이터 접근부분을 분리한다. 여기서 접근 데이터는 List<Apple> 이다.

    //Apple 선별 함수
    //ApplePredicate : method 의 동작을 파라미터화 하여, 변화에 유연하게 대응하도록 한다. <- 동작파라미터화 사용 이유 !
    public static ArrayList<Apple> filterAppleList(List<Apple> appleList, ApplePredicate applePredicate) {
        ArrayList<Apple> resultApple = new ArrayList<>();
        for (Apple apple : appleList) {
            if (applePredicate.test(apple)) {
                resultApple.add(apple);
            }
        }
        return resultApple;
    }

 

동작 구현

1. 인터페이스를 사용하여, 각 동작을 클래스로 구현 

ApplePredicate 인터페이스를 상속받아 필요한 동작들을 구현하였다.

public class BehaviorParametersWithInterfaceEx {
    
    ...
    
    //Apple 선별 기준 동작 클래스 : 15g 이상인 사과
    public static class AppleWeightFilter implements ApplePredicate {
        @Override
        public boolean test(Apple apple) {
            return apple.getWeight() >= 15f;
        }
    }

    //Apple 선별 기준 동작 클래스 :  사과색 GREEN
    public static class AppleColorFilter implements ApplePredicate {
        @Override
        public boolean test(Apple apple) {
            return "GREEN".equals(apple.getColor());
        }
    }
}

 

2. 익명 클래스 사용

매번 인터페이스를 상속받아 클래스를 구현하고, 구현된 클래스를 사용하는 것은 귀찮은 일이다.

( 특히, 구현된 클래스를 다른 부분에서 재사용하지 않는 경우... 굳이 클래스를 정의해야 하나.... 라는 생각이 든다. )

그래서 아래 방법은 익명 클래스를 이용하여, 좀 더 간결하게 구현됨을 보여준다.

public class BehaviorParametersWithAnonymousClassEx {
    //main
    public static void main(String[] str) {
     	...
        
        //Apple 선별 기준 동작 익명클래스 : 15g 이상인 사과
        filterAppleList(appleList, new ApplePredicate(){
            @Override
            public boolean test(Apple apple) {
                return apple.getWeight() >= 15f;
            }
        });

        //Apple 선별 기준 동작 익명클래스 :  사과색 GREEN
        filterAppleList(appleList, new ApplePredicate() {
            @Override
            public boolean test(Apple apple) {
                return "GREEN".equals(apple.getColor());
            }
        });
    }
}

 

3. 람다 이용

익명클래스를 사용하기 위해서는, 동작 로직을 수행하기 위해, 객체를 생성해야 하는 부분이 작성되어야 한다. 

람다를 이용해 더 간결하게 작성할 수 있으며, 아래는 람다를 적용한 코드이다.

public class BehaviorParametersWithLambdaEx {
    //main
    public static void main(String[] str) {
		...

        //Apple 선별 기준 동작 람다 이용 : 15g 이상인 사과
        filterAppleList(appleList, (Apple apple) -> apple.getWeight() >= 15f);

        //Apple 선별 기준 동작 람다 이용 :  사과색 GREEN
        filterAppleList(appleList, (Apple apple) -> "GREEN".equals(apple.getColor()));
    }
}

 

 


 

마치며

 

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

- 동작 파라미터화를 이용하면 변화하는 요구사항에 더 잘 대응할 수 있는 코드를 구현할 수 있으며, 나중에 엔지니어링 비용을 줄일 수 있다.

- 코드 전달 기법을 이용하면 동작을 메서드의 인수로 전달할 수 있다.

단, JAVA 8 이전에는 코드를 지저분하게 구현해야 했다면, JAVA 8 이후부터는 인터페이스를 상속받아 여러 클래스를 구현해야 하는 수고를 없앨 수 있는 방법을 제공한다.

- 자바 API의 많은 메서드는 정렬, 스레드, GUI 처리 등을 포함한 다양한 동작으로 파라미터화할 수 있다.

 

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함