Post

Kotlin Higher-Order Functions

Kotlin Higher-Order Functions

Kotlin 기초: 고차 함수 (Higher-Order Functions)

📦 Kotlin의 고차 함수 (Higher-Order Function)

고차 함수(Higher-Order Function)란 함수를 매개변수로 받거나, 함수를 결과로 반환하는 함수를 의미합니다.

Kotlin은 고차 함수를 자연스럽게 구현할 수 있습니다. 이는 코드를 더 간결하고 유연하게 만들어주는 함수형 프로그래밍의 핵심 특징 중 하나입니다.

📌 고차 함수의 역할

  • 추상화 수준 향상: 특정 동작(함수)을 파라미터로 받아 처리하므로, 코드의 구체적인 구현을 숨기고 로직의 흐름에 집중할 수 있습니다.
  • 코드 재사용성 증가: 여러 곳에서 반복되는 로직을 함수로 정의하고, 필요에 따라 이 함수를 다른 고차 함수에 전달하여 재사용할 수 있습니다.
  • 유연한 설계: 실행 시점에 동작을 결정하고 변경할 수 있어, 더욱 동적인 프로그램을 만들 수 있습니다.

✍️ 고차 함수와 람다 표현식 (Lambda Expressions)

Kotlin에서는 주로 람다 표현식을 사용하여 고차 함수를 간결하게 작성합니다. 람다는 이름 없는 함수로, 코드 블록 형태로 다른 함수에 쉽게 전달할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// (Int, Int) -> Int 타입의 함수를 매개변수로 받는 고차 함수
fun calculate(a: Int, b: Int, operation: (Int, Int) -> Int): Int {
    return operation(a, b)
}

fun main() {
    // 람다식을 사용하여 덧셈 로직을 전달
    val sum = calculate(10, 5) { x, y -> x + y }
    println(sum) // 15

    // 람다식을 사용하여 곱셈 로직을 전달
    val product = calculate(10, 5) { x, y -> x * y }
    println(product) // 50
}

💡 Tip: 위 예시처럼 함수의 마지막 파라미터가 람다식인 경우, 괄호 () 밖으로 람다를 꺼내서 작성할 수 있습니다. 이를 후행 람다(Trailing Lambda)라고 하며 가독성을 높여줍니다.


⚙️ 고차 함수의 활용 예시

고차 함수는 Kotlin 표준 라이브러리 전반에 걸쳐 다양하게 사용되며, 특히 컬렉션(Collection)을 다룰 때 그 강력함이 드러납니다.

📝 함수를 변수에 할당

함수 자체를 변수에 저장하고, 필요할 때 이 변수를 통해 함수를 호출할 수 있습니다.

  • 예시:
    1
    2
    3
    4
    5
    6
    
    // (Int, Int) -> Int 타입의 람다식을 변수에 할당
    val multiply: (Int, Int) -> Int = { a, b -> a * b }
    
    // 변수를 함수처럼 호출
    val result = multiply(10, 3)
    println(result) // 30
    

📚 컬렉션(Collection) 작업

컬렉션의 데이터를 반복, 변환, 필터링하는 작업을 매우 간결하게 처리할 수 있습니다.

함수설명예시 코드 (numbers = listOf(1, 2, 3, 4, 5))
forEach컬렉션의 각 요소를 순회하며 주어진 작업을 수행합니다.numbers.forEach { println(it) }
map각 요소를 변환하여 새로운 리스트를 생성합니다.val squared = numbers.map { it * it }
filter주어진 조건을 만족하는 요소만 골라 새로운 리스트를 만듭니다.val evens = numbers.filter { it % 2 == 0 }
associateWith컬렉션의 각 요소를 키로 사용하여 맵(Map)을 생성합니다.numbers.associateWith { it.toString() }
  • 데이터 필터링 및 조작 예시:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    data class Person(val name: String, val age: Int)
    
    val people = listOf(
        Person("Alice", 29),
        Person("Bob", 31),
        Person("Carol", 25)
    )
    
    // 30세 미만인 사람만 필터링하여 이름 출력하기
    people.filter { it.age < 30 }
          .map { it.name }
          .forEach { println(it) } // Alice, Carol 출력
    
This post is licensed under CC BY 4.0 by the author.