✅ Kotlin의 함수형 기능의 핵심은 **람다 표현식, 수신 함수(Receiver Function), 클로저(Closure)**입니다. 이들은 단순 문법을 넘어 DSL 구성, 고차 함수, 스코프 함수 등의 기반이 됩니다.
🔹 1. 람다(Lambda) 표현식
📌 람다는 이름 없는 익명 함수로, 함수 리터럴(Function Literal)의 한 종류입니다.
val square = { x: Int -> x * x }
println(square(4)) // 16
{ 파라미터 -> 본문 }형태- 파라미터 타입은 추론 가능
return없이 마지막 표현식이 반환값
🔍 사용 예시
val list = listOf(1, 2, 3, 4) // 원본 리스트
val doubled = list.map { it * 2 } // 람다 사용: 각 요소를 2배
println(doubled) // 결과: [2, 4, 6, 8]
🔍 return@label로 흐름 제어하기
fun process(list: List<Int>) {
list.forEach {
if (it == 2) return@forEach
println(it)
}
}
return→ 전체 함수 종료return@forEach→ 람다 블록만 종료 (safe exit)
🔹 2. 수신 함수 (Receiver Function)
📌 수신 함수는 함수 내부에서 this를 통해 수신 객체의 멤버에 직접 접근할 수 있는 함수입니다. Kotlin DSL이나 스코프 함수에서 널리 쓰입니다.
fun String.surroundWithQuote(): String = this.let { "\"$it\"" }
println("Hello".surroundWithQuote()) // "Hello"
📎 수신 객체가 있는 람다 예 (스코프 함수에서도 활용)
val builder = StringBuilder().apply {
append("Hello")
append(" World")
}
println(builder.toString())
this는 수신 객체를 나타냄- 수신 타입은 함수 선언부에 명시됨
📌 수신 함수 + 고차 함수 조합 예 (DSL 기반)
fun html(init: HTML.() -> Unit): HTML {
val html = HTML()
html.init() // 수신 객체 HTML에 대해 람다 실행
return html
}
🔹 3. 클로저 (Closure)
📌 클로저는 람다 내부에서 외부 변수나 상태를 캡처해 저장하고, 이후에도 참조 가능한 구조입니다.
fun counter(): () -> Int {
var count = 0
return { ++count } // count를 캡처한 클로저
}
val c = counter()
println(c()) // 1
println(c()) // 2
- 외부 변수 캡처 → 람다 실행 시 계속 유지됨
- 상태를 유지하는 함수형 스타일 구현 가능
🔍 클로저 주의점: 메모리 누수 가능성
- 캡처된 외부 변수는 람다가 참조하는 한 메모리에 남아 GC 대상이 되지 않을 수 있음 → 장기 실행 시 주의
🔹 4. 수신 함수 vs 일반 함수
| 구분 | 일반 함수 | 수신 함수 |
|---|---|---|
| 선언 형식 | fun f(x: Int) |
fun String.f() |
| 호출 방식 | f(x) |
"hi".f() |
| 내부 접근 | 파라미터로만 접근 | this 생략 가능 |
✅ 정리
- 람다: 익명 함수, 고차 함수에 전달, map/filter 등에서 사용
- 수신 함수:
this를 수신 객체로 암묵 전달, 확장 함수/DSL 기반 - 클로저: 외부 변수 상태를 유지하는 람다 구조
🔹 이 3가지 개념은 Kotlin 함수형 문법의 기초이며, 스코프 함수, 고차 함수, DSL 구성에도 반복적으로 등장합니다.
다음 시리즈 ⑯에서는 "널 처리 & 안전 호출"을 다룹니다.
'Code Odyssey' 카테고리의 다른 글
| Kotlin 코딩테스트 문법 시리즈 ⑰ : 타입 변환 & 확장 유틸 (1) | 2025.07.17 |
|---|---|
| Kotlin 코딩테스트 문법 시리즈 ⑯ : 널 처리 & 안전 호출 (0) | 2025.07.16 |
| Kotlin 코딩테스트 문법 시리즈 ⑭ : 함수 패턴 정리 (3) | 2025.07.14 |
| Kotlin 코딩테스트 문법 시리즈 ⑬ : Scope Function 정리 (let, also, apply, run, takeIf) (0) | 2025.07.13 |
| Kotlin 코딩테스트 문법 시리즈 ⑫ : 누적 함수 정리 (reduce, fold, scan) (1) | 2025.07.12 |