Kotlin 코딩테스트 문법 시리즈 ⑮ : 람다, 수신 함수, 클로저 개념과 활용

2025. 7. 15. 05:23·Code Odyssey

✅ 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
'Code Odyssey' 카테고리의 다른 글
  • Kotlin 코딩테스트 문법 시리즈 ⑰ : 타입 변환 & 확장 유틸
  • Kotlin 코딩테스트 문법 시리즈 ⑯ : 널 처리 & 안전 호출
  • Kotlin 코딩테스트 문법 시리즈 ⑭ : 함수 패턴 정리
  • Kotlin 코딩테스트 문법 시리즈 ⑬ : Scope Function 정리 (let, also, apply, run, takeIf)
Celion
Celion
오늘도 평소처럼 화이팅!
  • Celion
    Orion Log
    Celion
  • 전체
    오늘
    어제
    • 전체 글 (144)
      • Uncompiled Thoughts (8)
        • 네이버 부스트캠프 10기 (5)
      • CS 기초부터 한 걸음씩 (34)
      • Code Odyssey (22)
      • Algorithm (77)
        • Coding Test Records (63)
      • Git (3)
      • reference (0)
  • 블로그 메뉴

    • 태그
    • 방명록
  • 태그

    Kotlin
    java
    알고리즘고득점kit
    Level2
    백준
    문법정리
    프로그래머스
    시뮬레이션
    코테
    boostcamp
    Level3
    greedy
  • 최근 글

  • 인기 글

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.4
Celion
Kotlin 코딩테스트 문법 시리즈 ⑮ : 람다, 수신 함수, 클로저 개념과 활용
상단으로

티스토리툴바