코틀린의 람다 표현식(Lambda Expressions)
코틀린의 람다 표현식(Lambda Expressions)
람다 표현식(lambda expression)이란 이름이 없는 익명 함수로, 값처럼 다룰 수 있는 함수 리터럴입니다. 다른 함수의 인자로 전달하거나, 반환값으로 사용하거나, 변수에 저장하는 것이 모두 가능합니다. 람다는 코틀린의 함수형 프로그래밍을 떠받치는 핵심 기능이며, 표준 라이브러리뿐 아니라 Jetpack Compose와 코루틴 API 전반에서 폭넓게 활용됩니다. 실무에서 코틀린을 사용하는 개발자라면 람다의 동작 원리를 정확히 이해하는 것이 매우 중요합니다.
이번 면접 질문을 통하여 아래 내용들을 학습하실 수 있습니다.
- 람다 표현식의 문법과 컴파일러가 타입을 추론하는 방식을 설명할 수 있습니다.
- 단일 매개변수 람다에서 암시적
it매개변수를 활용할 수 있습니다. - 람다가 둘러싸는 스코프의 변수를 캡처하는 원리를 이해할 수 있습니다.
- 후행 람다(trailing lambda) 문법을 활용하여 간결한 함수 호출을 작성할 수 있습니다.
람다 문법
람다 표현식은 중괄호 {}로 감싸는 형태를 가집니다. 매개변수가 있는 경우 -> 기호 앞에 매개변수를 선언하고, 그 뒤에 본문을 작성합니다. 본문의 마지막 표현식이 곧 반환값이 됩니다.
val greet: (String) -> String = { name ->
"Hello, $name"
}
println(greet("skydoves")) // 출력: Hello, skydoves
컴파일러가 주변 문맥에서 매개변수 타입을 추론할 수 있다면 타입 어노테이션을 생략할 수 있습니다. 이는 함수 시그니처에 기대하는 함수 타입이 명시되어 있는 함수에 람다를 전달할 때 가장 흔하게 볼 수 있는 패턴입니다.
매개변수가 없는 람다는 -> 자체를 생략합니다. 중괄호 사이에 본문만 작성하면 됩니다.
val sayHello = { println("Hello, World!") }
sayHello() // 출력: Hello, World!
매개변수가 여러 개인 경우에는 화살표 앞에 쉼표로 구분하여 나열합니다. 구조 분해 선언(destructuring declaration)도 지원하므로, Pair나 Map 엔트리를 다룰 때 유용하게 활용할 수 있습니다.
val map = mapOf("a" to 1, "b" to 2)
map.forEach { (key, value) ->
println("$key = $value")
}
암시적 it 매개변수
람다에 매개변수가 정확히 하나만 있을 때, 코틀린에서는 매개변수 선언을 생략하고 암시적 이름인 it을 대신 사용할 수 있습니다.
val numbers = listOf(1, 2, 3, 4, 5)
val squared = numbers.map { it * it }
println(squared) // 출력: [1, 4, 9, 16, 25]
단순한 변환 로직에서는 it을 사용하면 코드가 훨씬 간결해집니다. 다만, 매개변수가 여러 개이거나 it의 의미가 모호한 경우에는 명시적으로 이름을 선언하는 편이 가독성을 높여 줍니다. 면접에서도 it 사용의 장단점을 설명할 수 있으면 좋은 인상을 줄 수 있습니다.
후행 람다(Trailing Lambda) 문법
함수의 마지막 매개변수가 함수 타입인 경우, 코틀린에서는 람다를 소괄호 바깥으로 빼낼 수 있습니다. 람다가 유일한 인자라면 소괄호 자체를 생략하는 것도 가능합니다.