람다는 익명 함수이며, 함수형 프로그래밍에서 자주 사용하는 패턴이다. 코틀린은 객체지향 프로그래밍 뿐만 아니라 함수형 프로그래밍 또한 지원하는 언어이기 때문에 당연히 람다 표현식을 사용할 수 있다.
익명함수는 아래처럼 이름없이 정의되는 함수를 말한다. 변수 printHello에 할당되고 있는 내용이 바로 익명함수이다.
// 익명함수를 생성하여 printHello에 할당
val printHello = fun(){ println("Hello, world!") }
// 익명함수 호출
printHello()
실행결과
Hello, world!
람다를 이용하면 더 간단히 익명함수를 정의할 수 있다. 아래는 위와 동일한 코드를 람다로 재작성 한 것이다.
// 익명함수를 생성하여 printHello에 할당
val printHello = () -> Unit = { println("Hello, world!") }
// 익명함수 호출
printHello()
fun main(args: Array<String>) {
// 익명함수를 생성하여 printHello에 할당
val printHello = { name: String, age:String -> "Hello. My name is $name. I'm $age year old" }
// 익명함수 호출
val result = printHello("김은빈", "17")
println(result)
}
익명함수에서도 인자를 받아 값을 반환할 수 있다.
->
의 옆에 하나의 값이나 문장이 들어오면 return
을 생략할 수 있다. 여러 줄의 코드가 들어가는 경우엔 중괄호를 넣어줘야한다. (자바와 같다)
fun main(args: Array<String>) {
val printHello: (String, String) -> String = { name, age -> "Hello. My name is $name. i'm $age year old" }
val result = printHello("김은빈", "17")
println(result)
}
함수의 인자, 반환 타입을 정의한 다음에 익명함수를 만드는 방법도 있다.
val printHello: (String) -> String = { name -> "Hello. My name is $name."}
val result = printHello("김은빈")
인자가 1개일때는 아래와 같이 인자의 이름을 선언하지 않아도 된다.
val printHello: (String) -> String = { "Hello. My name is $it."}
val result = printHello("김은빈")
인자 name
을 생략한 대신 it
으로 인자에 접근하고 있다. 코틀린은 인자를 생략하는 경우 it
으로 인자를 사용할 수 있다.