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.