[깡샘의 코틀린 프로그래밍] 정리 12 - 람다 표현식
본 글은 [깡샘의 코틀린 프로그래밍 - 루비페이퍼] 의 내용을 발췌한 것입니다.
좀더 자세한 내용은 책을 통해 확인해 주세요.
12장. 함수형 프로그래밍과 람다
12.2.1. 람다 표현식이란?
람다식, 또는 람다 함수는 프로그래밍 언어에서 사용되는 개념으로 익명 함수 (Anonymous Functions)를 지칭하는 용어입니다. 많은 프로그래밍 언어에서 지원하며 함수형 프로그래밍을 목적으로 하지 않더라도 코드의 간결함을 주목적으로 자주 이용합니다. 물론 함수형 프로그래밍에서는 람다 함수가 고차 함수의 매개변수나 반환값으로 사용되므로 더욱 중요합니다. 고차 함수는 이후 자세히 살펴보도록 하고 우선 코틀린에서의 람다 표현식에 대해 살펴보겠습니다.
코틀린에서 함수의 정의는 fun 예약어를 이용합니다.
fun 예약어를 이용하여 함수를 정의하며 fun 뒤에 함수이름을 명시하고 ( ) 안에 매개변수를 정의합니다. 그리고 함수 내용(function body)을 { } 안에 정의하는 것이 일반적인 함수 선언 방법입니다. 그런데 람다 함수는 fun과 함수이름을 명시하지 않고 축약형으로 선언합니다.
람다 함수는 { } 안에 매개변수와 함수 내용을 선언하는 함수로 다음 규칙에 따라 정의합니다.
- 람다 함수는 항상 { }으로 감싸서 표현해야 한다.
- { } 안에 -> 표시가 있으며 -> 왼쪽은 매개변수, 오른쪽은 함수 내용이다.
- 매개변수 타입을 선언해야 하며 추론할 수 있을 때는 생략할 수 있다.
- 함수의 반환값은 함수 내용의 마지막 표현식이다.
예를 들어 람다 함수 사용 방법을 살펴보겠습니다. 간단하게 두 개의 Int 타입 매개변수를 가지며 두 매개변수의 합을 구해 반환하는 함수를 작성해 보겠습니다. 먼저 일반 함수는 다음처럼 정의할 수 있습니다.
01 fun sum(x1: Int, x2: Int): Int {
02 return x1 + x2
03 }
이미 앞에서 살펴본 특별하지 않은 함수 정의입니다. fun 예약어를 이용하고 sum이라는 함수명을 사용 했으며 매개변수와 반환값이 있습니다. 그런데 위의 함수를 람다 함수로 정의하면 다음처럼 정의할 수 있습니다.
01 val sum1 = { x1: Int, x2: Int -> x1+x2 }
02
03 fun main(args: Array<String>) {
04 val result1 = sum1(10, 20)
05 }
01번 줄에 람다 함수를 정의했습니다. 람다 함수는 fun 예약어를 사용하지 않으며 함수명도 명시하지 않습니다. 함수의 모든 내용이 { } 안에 포함되며 -> 기호 왼쪽이 매개변수 영역입니다. 즉, 이 함수는 Int 타입 매개변수를 두 개 포함하는 함수입니다. 그리고 -> 오른쪽이 함수 내용입니다. 이곳에서는 매개변수 값을 더해서 값을 반환하는 구문을 작성했습니다. return 문을 명시하지 않았지만, 람다 함수에서는 함수 내용의 마지막 줄이 반환값이므로 x1 + x2 식의 결괏값을 반환합니다.
01번 줄에 정의한 람다 함수는 이름이 없어서 호출하여 이용할 수 없습니다. 그래서 sum1이라는 변수에 대입했습니다. 이처럼 변수에 함수를 대입하는 게 이상해 보일 수 있지만, 함수형 프로그래밍에서는 함수가 일급 객체입니다. 따라서 함수를 변수에 대입하거나 다른 함수의 매개변수에 대입하거나 다른 함수의 반환값으로 사용할 수 있습니다. 결국, 함수가 일반 변수처럼 이용될 수 있습니다.
그렇다면 람다 함수를 이용하려면 위의 코드처럼 항상 변수에 대입해서 이용해야 할까요? 그렇지는 않습니다. 이곳에서는 람다 함수의 정의 자체에 초점을 맞춘 설명이다 보니 01번 줄에서 람다 함수를sum1 변수에 대입하고 이 함수를 이용하기 위해 04번 줄처럼 sum1(10, 20) 형태로 함수를 호출한 예 입니다. 원한다면 람다 함수를 정의하자마자 함수 호출로 실행할 수도 있습니다.
01 { println("hello")}()
02 run { println("world") }
람다 함수는 이름이 없는 익명 함수입니다. 따라서 함수를 정의한 후 위에서 살펴본 것처럼 변수에 대입하지 않으면 이후 이 람다 함수를 사용할 수 없습니다. 그런데 만약 람다 함수를 정의한 후 바로 호출하겠다면 변수에 대입하지 않고 호출할 수 있습니다. 위의 소스에서 01번 줄을 보면 람다 함수 뒤에 함수 호출 구문 ( )을 추가했습니다. 람다 함수를 정의하자마자 바로 호출한 예입니다. 물론 02번 줄처럼 작성해도 됩니다. 람다 함수를 run( ) 함수에 대입하면 바로 람다 함수가 호출되어 실행됩니다