JaeniWorld

[Java 8] 동작 파라미터화 (behavior Parameterization) 본문

프로그래밍/JAVA

[Java 8] 동작 파라미터화 (behavior Parameterization)

jaeni 2021. 1. 18. 16:13
반응형

동작 파라미터화

여러 가지 다른 동작을 매개 변수로 받아 내부적으로 사용해 작업을 수행하는 메소드의 기능으로

행위의 매개변수화 라고도 함

쉽게 말해 변화하는 요구사항에 대응하기 위해 동작을 변수로 받는 것

 

아무래도 개발을 하다보면 기능이 추가되거나 코드를 고쳐야할 일이 많다.

다양한 요구사항들을 유연하게 대응하기 위해 주로 동작 파라미터화를 사용하며

아래 예제를 통해 정리하려고 한다.

 

1. 녹색 사과 필터링

사과농장에서 사용할 어플리케이션에 추가될 기능으로 녹색사과 필터링을 만든다.

//Color 정의
enum Color {RED,GREEN}

//녹색사과 필터링
Public static List<Apple> filterGreenApples(List<apple> inven){
	List<Apple> result = new ArrayList<>();
	for(Apple a: inven){
		if(GREEN.equals(apple.getColor()){
			Result.add(apple);
            }
        }
		return result;
}

 

2.빨간사과 필터링 요청으로 색상 필터링 메소드로 변경

Public static List<Apple> filterApples(List<apple> inven, Color color){
	List<Apple> result = new ArrayList<>();
	for(Apple a: inven){
		if(apple.getColor().equals(color)){
			Result.add(apple);
            }
        }
		return result;
}

 

3. 무게에 따른 필터링 요청으로 메소드 변경

Public static List<Apple> filterApples(List<apple> inven, Color color
						, int weight, boolean flag){
	List<Apple> result = new ArrayList<>();
	for(Apple a: inven){
		if((flag&&apple.getCoor().equals(color))||
        	(!flag&&apple.getWeight()>weight)){
            result.add(apple);
        }
		return result;
}

4. 동작 파라미터화

참 또는 거짓을 반환하는 함수 프레디케이트를 사용해 선택조건을 결정하는 인터페이스 정의

//무거운 사과 선택하는 메소드
public class AppleHeavyWeightPredicate implements ApplePredicate{
	public boolean test(Apple apple){
    	return apple.getWeight() > 150;
        }
}

//녹색 사과 선택
public class AppleGreenColorPredicate implements ApplePredicate{
	public boolean test(Apple apple){
    	return GREEN.equals(apple.getColor());
        }
}

public class FilteringApples{
	public static void main(String.. args){
    	List<Apple> inven = Arrays.asList(new Apple(80,GREEN),
        				new Apple(120,RED),
            				new Apple(155,GREEN));
            
        List<Apple> heavyApples =
        	filterApples(inven, new AppleHeavyWeightPredicate());
        List<Apple> greenApples =
        	filterApples(inven, new AppleGreenColorPredicate());
       }
}

Public static List<Apple> filterApples(List<apple> inven, ApplePredicate p){
	List<Apple> result = new ArrayList<>();
	for(Apple a: inven){
		if(p.test(apple)){
            result.add(apple);
        }
		return result;
}

5. 익명클래스 사용

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

 

6. 람다 표현식 사용

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

 

예제 참고

모던 자바 인 액션 (Modern Java in Action)

book.interpark.com/product/BookDisplay.do?_method=detail&sc.prdNo=312915546&gclid=Cj0KCQiA3Y-ABhCnARIsAKYDH7ufpYTtfPXP947kocSvKkxxnSOMB7db2U-qNZ_xuGpJSBcoCY-VTbIaAlSMEALw_wcB

 

반응형

'프로그래밍 > JAVA' 카테고리의 다른 글

[Java] 디폴트 메소드(Default methods)  (0) 2021.01.12
[Java] Java 8에 추가된 API  (0) 2021.01.12
[Java] Collection factory  (0) 2021.01.12
[Java] Stream 데이터 수집  (0) 2021.01.11
[Java] Stream 연산  (0) 2021.01.11
Comments