코틀린의 고차 함수 (Higher Order Functions)
코틀린의 고차 함수 (Higher Order Functions)
고차 함수(higher-order function)란 다른 함수를 매개변수로 받거나, 함수를 반환하거나, 혹은 두 가지를 모두 수행하는 함수를 의미합니다. 이 개념은 코틀린이 함수형 프로그래밍(functional programming)을 지원하는 데 핵심적인 역할을 하며, 콜백, 컬렉션 변환, DSL 구성 등 다양한 패턴에 활용됩니다. 고차 함수를 활용하면 동작(behavior)을 데이터처럼 전달할 수 있어 코드의 모듈성, 재사용성, 표현력을 높여 줍니다. 면접에서도 고차 함수에 대한 이해도는 코틀린 숙련도를 가늠하는 중요한 척도가 되므로, 개념뿐 아니라 실전 활용 패턴까지 함께 익혀 두시길 권장합니다.
이번 면접 질문을 통하여 아래 내용들을 학습하실 수 있습니다.
- 함수 타입 매개변수를 받는 고차 함수를 정의하는 방법
- 동적 동작 조합을 위해 함수를 반환하는 함수를 구현하는 방법
- 람다와 함수 참조가 고차 함수의 인자로 어떻게 활용되는지에 대한 이해
- 표준 라이브러리 고차 함수와 컬렉션 처리에서의 활용 방식
함수를 매개변수로 받기
고차 함수는 하나 이상의 매개변수를 함수 타입으로 선언합니다. 코틀린에서 함수 타입은 (InputTypes) -> ReturnType 형태로 표현됩니다.
fun operate(x: Int, y: Int, operation: (Int, Int) -> Int): Int {
return operation(x, y)
}
위 코드에서 operation 매개변수는 두 개의 Int 값을 받아 Int를 반환하는 함수입니다. 호출하는 쪽에서 실제 동작을 람다로 전달하게 됩니다.
val sum = operate(3, 4) { a, b -> a + b } // 덧셈 동작 전달
val product = operate(3, 4) { a, b -> a * b } // 곱셈 동작 전달
람다 표현식 { a, b -> a + b }가 operation 인자로 전달됩니다. 코틀린의 후행 람다(trailing lambda) 문법 덕분에, 마지막 매개변수가 함수 타입이면 람다를 소괄호 바깥에 작성할 수 있습니다. 이러한 문법적 편의성은 고차 함수 호출을 매우 깔끔하게 만들어 주며, 코틀린의 대표적인 특징 중 하나입니다.
함수를 반환하기
고차 함수는 함수를 반환할 수도 있으며, 이를 통해 동적으로 동작을 조합할 수 있습니다.
fun multiplier(factor: Int): (Int) -> Int {
return { value -> value * factor }
}
val triple = multiplier(3)
println(triple(5)) // 출력: 15
multiplier 함수는 factor 매개변수를 클로저(closure)에 캡처한 후, 이를 활용하는 새로운 함수를 반환합니다. multiplier에 서로 다른 값을 전달할 때마다 고유한 동작을 가진 함수가 생성됩니다. 이 패턴은 팩토리 함수나 동작 구성기(behavior composer)를 만들 때 유용하게 쓰이며, 함수가 일급 시민(first-class citizen)으로서 값처럼 다뤄질 수 있다는 코틀린의 특성을 잘 보여 줍니다.
함수 참조
람다 대신 기존에 정의된 이름 있는 함수(named function)를 :: 참조 구문으로 전달할 수도 있습니다.