목차로 돌아가기
목표
- reduce의 개념을 이해한다.
- reduce를 사용하는 방법을 익힌다.
reduce()
개요
reduce는 순서가 있는 데이터(CharSequence, Iterable 등)에 대해 각 데이터에 대해 연산을 재귀적으로 수행해 반환해주는 함수이다. 시작 값은 맨 앞의 데이터이며, 반환 데이터 타입은 맨 앞의 데이터 타입을 따른다.
예를 들어 아래와 같은 sampleList가 있다고 하자. 이 List에 대해 reduce를 수행한다고 하면 맨 앞의 값인 "a"가 기본 값이 되며 반환값도 "a"의 데이터타입인 String이 된다.
val sampleList = listOf("a", "b", "c")
정의
자 이제 reduce가 어떻게 선언 되었는지 살펴보자. 아래는 Iterable의 확장함수로 정의된 reduce에 대한 정의이다.
public inline fun <S, T : S> Iterable<T>.reduce(operation: (acc: S, T) -> S): S
reduce 연산 수행 시 각 값들은 reduce에서 받은 operation이라는 함수에 해당하는 연산이 재귀적으로 수행되어 반환된다. reduce는 S 타입의 acc(accumulator의 약자) 값과, S를 구현하는 T라는 타입의 값을 인자로 받아 S를 반환하는 operation 함수를 인자로 받는다.
예제
예를 들어 sampleList에 대해 reduce 연산을 수행한다고 하자. 아래는 람다식으로 구현한 예제 코드이다.
val sampleList = listOf("a", "b", "c")
val sampleResult = sampleList.reduce { acc, s -> acc + s } // abc
위의 코드를 수행했을 때 아래와 같은 연산 순서를 갖는 결과가 나온다. list의 각 원소에 대해 순차적으로 operation에 해당하는 연산을 수행한다. 람다식이므로 맨 마지막에 나온 값이 return 값이 된다.
1. "a" + "b" = "ab"
2. "ab" + "c" = "abc"
3. "abc" 반환
물론 이렇게 써야만 하는 것은 아니고 별도로 연산을 값으로 만들어서 인자로 넘겨줘도 괜찮다. 이에 대한 것이 이해가 가지 않는다면 코틀린 함수형 프로그래밍 방법을 살펴보길 추천한다.
val sampleList = listOf("a", "b", "c")
val plusOperation = { acc: String, s: String -> acc + s }
val sampleResult = sampleList.reduce(plusOperation) // abc