🎭 고차 함수
📖 고차 함수란?
**고차 함수(Higher-Order Function)**는 함수를 인자로 받거나 함수를 반환하는 함수입니다. Kotlin의 함수형 프로그래밍 핵심입니다!
💡 기본 개념
함수를 인자로
fun calculate(a: Int, b: Int, operation: (Int, Int) -> Int): Int {
return operation(a, b)
}
fun main() {
// 람다 전달
val sum = calculate(5, 3) { x, y -> x + y }
println(sum) // 8
val product = calculate(5, 3) { x, y -> x * y }
println(product) // 15
}
함수를 반환
fun makeMultiplier(factor: Int): (Int) -> Int {
return { number -> number * factor }
}
fun main() {
val double = makeMultiplier(2)
val triple = makeMultiplier(3)
println(double(5)) // 10
println(triple(5)) // 15
}
🔧 내장 고차 함수
filter
조건에 맞는 요소만 필터링
fun main() {
val numbers = listOf(1, 2, 3, 4, 5, 6)
// 짝수만
val evens = numbers.filter { it % 2 == 0 }
println(evens) // [2, 4, 6]
// 3보다 큰 수
val greaterThan3 = numbers.filter { it > 3 }
println(greaterThan3) // [4, 5, 6]
}
map
각 요소를 변환
fun main() {
val numbers = listOf(1, 2, 3, 4, 5)
// 제곱
val squared = numbers.map { it * it }
println(squared) // [1, 4, 9, 16, 25]
// 문자열로
val strings = numbers.map { "숫자: $it" }
println(strings) // [숫자: 1, 숫자: 2, ...]
}
forEach
각 요소에 작업 수행
fun main() {
val fruits = listOf("사과", "바나나", "포도")
fruits.forEach { fruit ->
println("과일: $fruit")
}
// 과일: 사과
// 과일: 바나나
// 과일: 포도
}
reduce
요소들을 누적 계산
fun main() {
val numbers = listOf(1, 2, 3, 4, 5)
// 합계
val sum = numbers.reduce { acc, num -> acc + num }
println(sum) // 15
// 최댓값
val max = numbers.reduce { acc, num ->
if (num > acc) num else acc
}
println(max) // 5
}
fold
초기값과 함께 누적
fun main() {
val numbers = listOf(1, 2, 3, 4, 5)
// 초기값 0에서 시작
val sum = numbers.fold(0) { acc, num -> acc + num }
println(sum) // 15
// 초기값 10에서 시작
val sumWith10 = numbers.fold(10) { acc, num -> acc + num }
println(sumWith10) // 25
}
🎯 실전 예제
커스텀 필터 함수
fun <T> customFilter(list: List<T>, predicate: (T) -> Boolean): List<T> {
val result = mutableListOf<T>()
for (item in list) {
if (predicate(item)) {
result.add(item)
}
}
return result
}
fun main() {
val numbers = listOf(1, 2, 3, 4, 5, 6)
val evens = customFilter(numbers) { it % 2 == 0 }
println(evens) // [2, 4, 6]
val greaterThan3 = customFilter(numbers) { it > 3 }
println(greaterThan3) // [4, 5, 6]
}