동작 파라미터화와 함수형 프로그래밍 (1)
포스팅 전 먼저 서론을 조금 써보자면, 보통 학교 교과목 숙제에서는 흔히 생기지 않는 일이지만, 공모전이나 조금 덩치가 있는 프로그램 혹은 일을 하다보면 가장 많이 생기는 것이 있는 것 같아요.
그것은 바로 "변화" 라는 생각이 드는데요.
회사에서도 일을 하다보면, 기획이나 디자인 혹은 개발과정 중 여러 상황 등 기타 이유로 인하여, 심심치 않게 변화가 등장함을 알 수 있습니다.
변화란 나쁜 것인가? 라고 생각했을 때 전 아닌 것 같습니다. 어디서 흔히 들은 이야기론,
"프로젝트의 변화가 나쁜 게 아니라, 변화에 적응하지 못하는 개발자의 무능함이 나쁘다"
이런게 있습니다. "변화를 사랑하는 개발자가 됩시다. ㅡㅡ^"
서론 부분에 변화에 대한 이야기를 쓴 이유는 함수형 프로그래밍의 4번째 포스팅인 동작 파라미터화(Behavior parameterization)와 관련된 이야기와 조금 관련이 있어서 조금 꺼내봤습니다.
이 이야기와 비슷한 포스팅을 아마,
이 곳에서 진행을 했었습니다. 이 곳에서 진행한 코드를 조금 더 디테일하게 리뷰해보고자 합니다. (귀찮아서 그러는게 아닙니다. ㅡㅡ^)
copy&paste가 변화에 유연하지 못함과 그렇기 때문에 이를 해결하기 위한 객체지향적 관점에서 여러 디자인 패턴이 등장했고, 지난번에는 그 중 추상화 과정을 통해 전략패턴을 사용해보았음을 알 수 있습니다.
그 중 우리가 다시한번 살펴볼 곳은, 아래 코드입니다.
/** * 사과 객체를 분류하기 위한 함수 * * @param appleList * @param appleFilter * @return */ public static List<Apple> GetFilterApple(List<Apple> appleList, AppleFilterAble appleFilter) { ArrayList<Apple> resultList = new ArrayList<>(); for (Apple apple : appleList) { if (appleFilter.isContain(apple)) { resultList.add(apple); } } return resultList; } | cs |
우리는 보다 GetFilterApple을 유연하게 사용하기 위해 interface를 만들어 inContain 에 대한 명세를 추상화하였고, 사용처에서 익명클래스로 할일에 대한 최종 명세를 표기하였습니다. 아래와 같이 말이죠.
1 2 3 4 5 6 7 | GetFilterApple(inventory, new AppleFilterAble(){ @Override public boolean isContain(Apple apple){ return "green".equals(apple.getColor()); } }); | cs |
여기에서 우린 isContain이라는 동작을 파라미터화(이번 포스팅의 주제)하여, GetFilterApple 메소드로 넘기게 되었고, 보다 더욱 변화에 유연하게 사용할 수 있게 되었습니다.
그러나, 이 곳에서 우리는 단지, inContain 이란 메소드를 넘기기 위해, 인터페이스를 만들고, 객체로 한번 감싸 넘기고 있습니다. 이런 과정이 보다 복잡하고, 어려운 작업이 될 수 있지 않을까요? (복잡한 것을 좋아하는 사람은 없습니다. ㅡㅡ^)
그렇기 때문에 람다 표현식과 메소드를 코드로 넘기는 방법 같은 방법이 제시 되었음을 알 수 있습니다. 아래는 지난번에 했던 람다표현식을 통해, 함수만 넘기는 예제입니다.
1 | GetFilterApple(inventory, (Apple a) -> "green".equals(a.getColor())); | cs |
우리는 동작을 추상화하고, 파라미터로 넘기는 것이 변화에 대해 유연함을 줄 수 있다는 것을 알았고, 함수형 프로그래밍을 통해 간결함까지 사용할 수 있음을 알 수 있게 되었습니다. 단순히 람다가 등장하여 코드가 짧아졌다는 것만을 알게 아니라, 이러한 전과정을 모두 알면 좋을 것 같아서 코드에 대한 리뷰를 다시 해보게 되었습니다.^^;
|
'개발이야기 > 함수형 프로그래밍' 카테고리의 다른 글
람다 표현식 (0) | 2016.07.27 |
---|---|
동작 파라미터화와 함수형 프로그래밍 (2) (0) | 2016.07.25 |
JAVA8 을 눈여겨봐야 하는 이유3 (기타 볼 내용) (0) | 2016.07.22 |
JAVA8 을 눈여겨봐야 하는 이유2 (스트림 API 등장) (0) | 2016.07.21 |
JAVA8 을 눈여겨봐야 하는 이유1 (메서드에 코드를 전달하는 기법) (2) | 2016.07.21 |