더북(TheBook)

컬렉션을 하나의 값으로 졸여내는 과정을 foldreduce라고 부른다. 두 연산 사이의 구분이 항상 명확하지는 않지만, 다음 두 가지 조건을 기준으로 두 연산을 구분한다.

시작하는 원소를 제공하느냐(fold), 제공하지 않느냐(reduce)

결과 타입이 컬렉션의 원소 타입과 동일하냐(reduce), 다르냐(fold)

컬렉션이 비어 있다면 reduce는 아무 결과도 내지 못하지만 fold는 시작 원소를 결과로 내놓는다는 차이도 있다. 6장에서 이 두 함수의 동작을 더 자세히 다룬다. 지금은 코틀린 컬렉션이 제공하는 fold 함수를 사용해야 한다. fold 함수는 인자가 둘이다. 첫 번째 인자는 시작 값이고, 두 번째 인자는 지금까지 누적해 온 값과 처리 대상 원소로부터 새로운 값을 만들어내는 함수다.

reduce 함수도 시작 값이 없다는 점을 제외하고는 fold와 아주 비슷하다. reduce는 첫 번째 원소를 시작 값으로 취하고 컬렉션 원소 타입과 같은 타입으로 결과 타입을 지정한다. 빈 컬렉션에 reduce를 적용하면 오류가 발생하거나 null이나 결과가 없음을 나타내는 다른 표현이 반환된다.

다음 코드에서는 fold를 사용하기 때문에 시작 값으로 가격이 0임을 표현하는 Price(0.0)과 무게가 0임을 표현하는 Weight(0.0) 사용한다. 두 번째 인자로 사용한 함수는 앞에서 정의한 덧셈 연산이다. 이를 함수 값으로 만들기 위해 람다를 사용한다.

val zeroPrice = Price(0.0)
val zeroWeigth = Weight(0.0)
val priceAddition = { x, y -> x + y }
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.