코틀린에서 함수는 특별한 취급을 받는 일급 시민(First-class citizen)입니다. 즉, 숫자를 변수에 담듯 함수 그 자체를 변수에 저장할 수 있고, 다른 함수의 파라미터로 넘겨줄 수도 있습니다.
이처럼 함수를 파라미터로 받거나 반환하는 함수를 고차 함수(Higher-Order Function)라 부르며, 이름 없이 중괄호 {}로 묶여서 전달되는 함수 블록을 람다(Lambda)라고 부릅니다.
💡 핵심 비유: 빈 슬롯이 있는 장난감 공장
고차 함수는 뼈대만 있고 배터리 슬롯이 비어 있는 '장난감 공장 기계'입니다. 람다(Lambda)는 우리가 직접 로직을 짜서 그 슬롯에 끼워 넣는 '배터리 블록'입니다. 코틀린은 마지막 파라미터가 배터리(람다)라면 괄호 밖으로 빼서 끼울 수 있는 매우 예쁜 문법(Trailing Lambda)을 지원합니다.
🧩 트레일링 람다 (Trailing Lambda) 다이어그램
📊 함수 타입과 람다 문법
개념
문법 / 예시
설명
함수 타입
(Int, Int) -> Int
정수 2개를 받아서 정수 1개를 반환하는 함수의 설계도(타입)입니다.
람다식
{ x, y -> x + y }
이름이 없는 익명 함수입니다. 화살표(->) 왼쪽이 파라미터, 오른쪽이 몸통입니다.
단일 파라미터 it
{ println(it) }
람다의 파라미터가 딱 1개라면 x -> 를 생략하고 it 이라는 키워드로 씁니다.
// 1. 고차 함수 (Higher-Order Function) 선언
// 세 번째 파라미터 'action'은 (Int, Int)를 받아서 Int를 반환하는 '함수 타입'을 요구합니다.
fun calculate(a: Int, b: Int, action: (Int, Int) -> Int): Int {
// 뼈대 기계가 작동하다가, 외부에서 주입받은 함수(배터리)를 여기서 실행시킵니다.
val result = action(a, b)
return result
}
fun main() {
// 2. 람다식을 변수에 저장하기
// 함수를 숫자나 문자열처럼 변수 sumLambda 에 저장합니다.
val sumLambda: (Int, Int) -> Int = { x, y -> x + y }
// 저장된 함수를 다른 함수의 파라미터로 넘겨줍니다.
println("람다 변수 테스트: " + calculate(10, 5, sumLambda))
// 3. 트레일링 람다 (Trailing Lambda)의 미학
// calculate의 마지막 파라미터가 '함수'이기 때문에, 소괄호()를 닫아버리고
// 그 뒤에 중괄호{}를 열어서 코드를 작성할 수 있습니다.
// (코틀린의 가독성을 극대화시키는 아주 중요한 문법입니다!)
val multiResult = calculate(10, 5) { x, y ->
x * y // 람다 블록의 가장 마지막 줄이 함수의 반환값이 됩니다.
}
println("트레일링 람다(곱셈): " + multiResult)
}