Kotlin/Collection

[Kotlin Collection] 5. Kotlin reduce 를 알아보자 : 재귀적으로 수행된 결과값으로 반환 값을 만드는 함수

반응형

목차로 돌아가기

 

[Kotlin Collection] Kotlin에서 확장함수를 이용해 Collection 조작하기

목표 Collection 확장함수가 하는 일을 이해한다. 자유롭게 확장 함수를 이용해 데이터를 조작한다. 개요  Kotlin에서는 일반 컬렉션에도 함수형 프로그래밍을 위한 확장 함수를 제공하여, 데이터를

kotlinworld.com

 

목표

  • 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

 

반응형

 

이 글의 저작권은 Kotlin World 에 있습니다. 글, 이미지 무단 재배포 및 변경을 금지합니다.