티스토리 뷰

스터디/모던 자바 인 액션

챕터 2

duswnsxnxn 2023. 8. 5. 08:18

동작 파라미터화란?

아직은 어떻게 실행할 것인지 결졍하지 않은 코드 블록을 의미한다.

애플리케이션을 만들고 나면 사용자마다 불만이 있을 수도 있는데 그럴 때마다 의견을 반영하여 코드를 추가 구현을 해야한다.

하지만 요구사항이 있을 때마다 매번 같은 코드를 복붙하여 구현하게 되면 유지보수성과 DRY(같은 것을 반복하지 말 것) 원칙을 어기게 된다.

동작파라미터화를 이용하면 요구사항에 효과적으로 대응할 수 있다.

다음은 녹색사과만을 필터링하여 리스트에 담는 코드이다.

public static List<Apple> filterGreenApples(List<Apple> inventory) {
	List<Apple> result = new Arraylist<>(); <- 사과누적 리스트
	for (Apple apple: inventory) t
		if (GREEN. equals(apple.getColor()) { <- 녹색 사과만 선택
			result. add(apple);
		}
	}
	return result;
}

갑자기 빨간사과도 필터링 하고 싶다는 요구사항이 추가되었다.

filterRedApples라는 새로운 메서드를 만들고 조건문의 코드를 변경하면 된다.

하지만 반복되는 코드추후 다양한 색의 필터링을 고려하면 적절하게 대응 할 수 없어진다.

이를 파라미터를 추가하여 해결해보자.

public static List <Apple> filterApplesBycolor (List<Apple> inventory, Color color)
{
	List<Apple> result = new Arraylist<>();
	for (Apple apple: inventory) {
		if (apple getcolor(). equals(color)) {
			result. add(apple);
		}
	}
	retumn result;
}

enum타입의 Color를 인자로 추가하고 (apple getcolor(). equals(color) 조건식을 변경함으로 다양한 색에 대응할 수 있다.

근데 갑자기 색말고도 무게로도 필터링 해야한다는 요구사항이 들어온다.

그럼 Color를 추가했듯이 int형의 weight로 변경하면된다.

public static List <Apple> filterApplesBycolor (List<Apple> inventory, int weigth)
{
	List<Apple> result = new Arraylist<>();
	for (Apple apple: inventory) {
		if (apple getWeigth() > weight) {
			result. add(apple);
		}
	}
	retumn result;
}

 

위 코드로 해결할 수 있지만 

if (apple getWeigth() > weight) {
			result. add(apple);
	}

조건문의 코드가 중복된다.

동작 파라미터를 사용해보자!

어떤 속성에 기초해서 불리언값을 반환하는 방법이 있는데 참 또는 거짓을 반환하는 함수인 프레디케이트를 이용하여 동작 파라미터화를 시킨다.

public interface ApplePredicate {
	boolean test (Apple apple);
}

먼저 인터페이스를 선언하고

public class AppleHeavyWeightPredicate implements ApplePredicate { <- 무거운 사과만 선택
	public boolean test(Apple apple) {
    	return apple.getWeigth() > 150;
    }
}
public class AppleGreenColorPredicate implements ApplePredicate { <- 녹색 사과만 선택
	public boolean test(Apple apple) {
    	return Green.equals(apple.getColor());
    }
}

이로써 filter 메서드가 다르게 동작할 것이다.

각 알고리즘(전략)을 캡슐화하는 알고리즘 패밀리를 정의해둔 다음에 런타임에 알고리즘을 선택하는 기법이라 하는데 이를 전략 디자인 패턴이라 한다.

public static List <Apple> filterApples (List<Apple> inventory, ApplePredicate p)
{
	List<Apple> result = new Arraylist<>();
	for (Apple apple: inventory) {
		if (p.test(apple) { <- Predicate 객체로 사과 검사 조건을 캡슐화했다.
			result. add(apple);
		}
	}
	retumn result;
}

이로써 사과를 필터링할 때 다양한 요구사항을 유연하게 대응할 수 있는 코드가 완성되었다.

만약 무게 150g이 넘는 빨간 사과를 검색해달라고 부탁하면 우리는 ApplePredicate만 요구사항에 맞게 구현하고

public class AppleRedAndHeavyPredicate implements ApplePredicate {
	public boolean test(Apple apple) {
    	return RED.equals(apple.getColor()) && apple.getWeight() > 150;
    }
}

파라미터에 넣어주면 된다.

List<Apple> redAndHeavyApples = filterApples(inventory, new AppleRedAndHeavyPredicate());

 

'스터디 > 모던 자바 인 액션' 카테고리의 다른 글

챕터 3  (0) 2023.08.08
챕터 1  (0) 2023.08.05
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/05   »
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
글 보관함