본문 바로가기
프로그래밍/코틀린

K014. 코틀린 함수(Functions) 깊게 살펴보기 - Functions 파트5

by K-인사이터 2024. 2. 15.
반응형

안녕하세요

K-IN 입니다.

 

코틀린에 대해서 알아보겠습니다. 

전체 강의 목록은 아래의 링크를 클릭해주세요.

 

K000. 코틀린 시리즈 (연재물)

안녕하세요 K-IN 입니다. 요즘 코틀린을 이용한 개발 프로젝트가 늘어나고 있습니다. 이에, 코틀린에 대해서 상세하게 정리하는 간행물을 제작하고자 합니다. 여기에 있는 링크들은 모두 코틀린

k-in.tistory.com

 

 

코틀린 함수(Functions) 

코틀린에서 함수에 대해서 이해하려면 아래의 개념들을 숙지해야합니다. "☆" 표기는 중요도를 나타냅니다.

분량이 많아 이글에서는 12번 항목까지만 다룹니다. 

 

이전 내용 코틀린 함수를 자세히 배우려면 아래의 링크들을 참고해주세요.

  1. 기본적인 함수 구조 ☆
  2. 함수 사용 방법 ☆
  3. 기본 인자(Default Arguments) ☆☆
  4. 이름지정 인자(Named Arguments) ☆☆
  5. 단일 표현식 함수(Single-expression Functions) ☆☆☆
  6. 명시적 리턴 타입(Explicit Return Types)
  7. 가변인자 (varargs) ☆☆☆
  8. 중위 표기법 (Infix Notation) ☆☆☆
  9. 함수의 범위 (Function Scope) ☆☆☆
  10. 제너릭 함수 (Generic Functions) ☆☆☆
  11. 꼬리 재귀 함수 (Tail Recursive Functions) ☆☆
  12. 람다 (Lambdas) ☆☆
  13. 인라인 함수 (Inline Functions) ☆☆☆
  14. 연산자 오버로딩 (Operator overloading) 
  15. 빌더 (Builders)

고차 함수와 람다 (Higher-Order Functions and Lambdas)

코틀린은 함수를 first-class 로 취급합니다.

즉, 함수가 변수 혹은 데이터 구조내에 저장되고 인자로 전달이 가능하며 고차 함수로부터 리턴되는 특성을 만족합니다. 

 

first-class 개념에 대해 쉽게 이해하고자 한다면 아래의 글을 참조해주세요.

2024.02.15 - [프로그래밍] - 컴퓨터 과학, First Class Functions/Citizens/Objects 의 개념

 

컴퓨터 과학, First Class Functions/Citizens/Objects 의 개념

안녕하세요 K-IN 입니다. 프로그래밍 언어를 배우다보면 컴퓨터 과학(Computer Science)에서 사용되는 용어들이 나오는 경우가 있습니다. 예를 들어, 아래와 같은 단어들이 주로 보입니다. First Class Fun

k-in.tistory.com

 

다시 본론으로 돌아와서, 코틀린은 이러한 특성을 잘 제공하기 위해 람다 표현식(lambda expressions)와 같은 특수한 언어 구조를 제공합니다.

 

그렇다면 앞서 언급한 고차함수(Higher-order functions)란 무엇일까요? 

고차함수란 다른 함수를 매겨변수로 받거나 함수를 반환하는 함수를 의미합니다. 

 

코틀린에서는 고차함수를 아래와 같은 형태로 정의할 수 있습니다. 

fun <T, R> Collection<T>.fold(
    initial: R,
    combine: (acc: R, nextElement: T) -> R
): R {
    var accumulator: R = initial
    for (element: T in this) {
        accumulator = combine(accumulator, element)
    }
    return accumulator
}

 

위 예제는 제너릭 컬렉션에 대한 확장함수인 fold 를 구현한 예제이며

고차함수와 람다식을 결합하면 컬렉션 요소들에 대해 다양한 연산들을 적용할 수 있습니다

파이썬 언어에서는 map 과 같은 역할을 수행합니다. 

 

fold 확장함수를 사용하는 예시들을 통해 람다 식을 통해서 다양한 연산을 수행하는 예시를 만들어 낼 수 있습니다.

  • 컬렉션 요소들에 대한 누적합을 계산
  • 컬렉션 요소들을 문자열 Join 연산 
  • 컬렉션 요소들에 대한 누적곱을 계산
val items = listOf(1, 2, 3, 4, 5)
println("------- 누적합(Cumulative sum) 연산  -------")
items.fold(0, { acc: Int, i: Int -> 
    print("acc = $acc, i = $i, ") 
    val result = acc + i
    println("result = $result")
    result
})
println("------- 문자열 join  -------")
val joinedToString = items.fold("Elements:", { acc, i -> acc + " " + i })
println(joinedToString)
println("------- Int::times 연산  -------")
// val product = items.fold(1, Int::times)
// 위 코드를 풀어내면 아래와 같습니다.
val product = items.fold(1, { acc, i -> 
    print("acc = $acc, i = $i, ") 
    val result = acc.times(i)
    println("result = $result")
    result

})
println(product)

 

 

 

이상입니다.

K-IN 올림. 

반응형