Java

동작 파라미터화

라우브 2020. 7. 27. 17:15

한 농장의 사과 재고 관리를 도와주는 애플리케이션을 작성중이다고 가정하자. 

사과의 정보는 다음과 같다.

어제는 농부가 빨간색 사과만 필터링해서 보여달라고 요청해서 다음과 같이 코드를 작성했다. 

하지만 오늘은 갑자기 무게가 150g이 넘는 사과만 필터링해 달라고 요청했다. 번거롭지만 다음과 같이 새로 코드를 작성했다.

기껏 작성했더니, 농부가 갑자기 색깔은 빨간색이면서 무게가 150g이 넘는 사과를 필터링해달라고 한다. 이와같이 요구사항이 변경될 때 마다 새로운 메서드를 작성하는 것은 매우 비효율적이다. 심지어 위 두 함수를 보면, if 의 조건부분을 제외한 나머지 코드는 모두 중복된다. 

변화하는 요구사항에 좀 더 유연하게 대응할 수 있는 방법이 필요해 보인다. 

이를 해결할 수 있는 방법이 바로 '동작 파라미터화' 이다.

 

우선 선택 조건을 결정하는 인터페이스를 정의한다.

이후 ApplePredicate를 구현하는 Predicate를 작성한다.

예를 들어 빨간색 사과를 필터링하고 싶다면 다음과 같이 작성한다.

코드를 보면 알 수 있듯, 현재 AppleRedPredicate는 ApplePredicate를 구현하고 있으며 전략패턴이 사용되었다.

즉 , ApplePredicate를 구현하고 있기만 한다면, 컴파일 타임에는 어떤 알고리즘으로 필터링하는지는 관심없으며, 런타임시에 필터링 알고리즘이 선택되는 것이다.

 

이제는 요구사항이 변경될 때마다 해당 요구사항을 충족시키는 ApplePredicate를 구현하는 Predicate를 생성하여 

filterApples의 두번째 인자로 넣어주기만 하면 된다. 즉, filterApples 메서드의 코드 수정이 필요가 없어졌다.

이처럼 동작 파라미터화를 적용하면, 코드 중복을 최소화할 수 있으며, 변화하는 요구사항에 유연하게 대처할 수 있다.

 

여기서 조금 더 나아가면, 람다식을 사용할 수 있다. 

한 두번만 사용하고 더 이상 사용할 일이 없는 메서드를 선언하는 것은 어쩌면 비효율적일 수 있다.

이럴 때 람다를 사용하면 좋다. 

람다를 사용하면 Predicate를 구현하는 class를 따로 선언할 필요 없이 코드 한줄로 필터링 할 수 있다.

아래는 람다를 사용하여 빨간 사과를 필터링 하는 코드이다.

 

 

 

'Java' 카테고리의 다른 글

equals(), hashCode (), == 연산자  (0) 2021.08.25
스트림  (0) 2020.07.28