기본적인 배열 연산을 구현해요.
함수형 언어에서는 length, map, reduce 같은 배열 연산을 아주 흔하게 사용해요.
기존 함수를 사용하지 않고, 일련의 기본적인 배열 연산을 직접 구현해요.
구현할 연산의 정확한 개수와 이름은 기존 이름과의 충돌을 피하기 위해 track마다 달라요. 하지만 일반적으로 구현하게 될 연산은 다음과 같아요:
append (주어진 두 배열에서, 두 번째 배열의 모든 항목을 첫 번째 배열의 끝에 추가해요);concatenate (주어진 여러 배열의 모든 항목을 하나로 평탄화한 배열로 합쳐요);filter (주어진 술어와 배열에서, predicate(item)이 True인 모든 항목의 배열을 반환해요);length (주어진 배열의 전체 항목 개수를 반환해요);map (주어진 함수와 배열에서, 모든 항목에 function(item)을 적용한 결과의 배열을 반환해요);foldl (주어진 함수, 배열, 초기 누적자를 받아, 왼쪽부터 각 항목을 누적자에 접어 넣어요(누적해요));foldr (주어진 함수, 배열, 초기 누적자를 받아, 오른쪽부터 각 항목을 누적자에 접어 넣어요(누적해요));reverse (주어진 배열의 모든 원래 항목을 뒤집힌 순서로 담은 배열을 반환해요).참고로, fold 함수(foldl, foldr)에 인자가 전달되는 순서는 중요해요.
Java에서는 클래스 메서드보다 인스턴스 메서드를 사용하는 것이 모범 사례라고 여겨요. 하지만 함수를 static으로 만드는 것이 완전히 적절한 경우도 있어요. Java의 클래스는 수정이 닫혀 있어서(Ruby나 JavaScript처럼 클래스 정의 밖에서 클래스에 멤버를 추가할 수 없어요), 클래스에 새로운 동작을 직접 추가할 수 없어요. 그래도 특정 타입에 동작을 정의하고 싶다면 어떻게 해야 할까요? 이럴 때 관용적인 해법은 유틸리티 메서드를 작성하는 거예요.
이런 메서드들을 모아 놓은 것을 흔히 "유틸리티 클래스"라고 불러요. JRE에 들어 있는 이런 클래스의 예로는 Arrays와 Collections가 있어요.
이 연습 문제에서는 List가 map(), reduce(), filter() 같은 메서드를 가지길 바라요. 하지만 List에는 그런 메서드가 없어서, 정적 메서드를 사용해요.
foldLeft와 foldRight 메서드는 "폴드" 함수예요. 폴드는 함수형 프로그래밍 세계에서는 잘 알려진 개념이지만, 객체 지향 프로그래밍 세계에서는 그만큼 알려져 있지 않아요. 폴딩에 관한 위키백과 문서에서 일반적인 배경과 시그니처/구현 힌트를 참고해요.
Exercism에 가입하고 Java 트랙을 개념 26개연습 문제 158개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.
재귀를 실용적으로 소개하는 내용을 즐기면서, 배열 연산의 명령형 및 함수형 대안을 살펴보고, 꼬리 호출 재귀와 누산기 함수까지 깊이 파고들어요.