Kotlin :: 프로그래밍 언어 배우기 (람다함수, 익명함수)

Android/Kotlin 2020.10.06 댓글 moonsu
728x90

본 문서는 안드로이드 개발자 가이드 를 토대로 작성되었습니다.

 

함수

 

3. 람다함수 (Lambda Functions)

람다식 또는 람다함수는 함수의 간결함을 목적으로 한다. 기존 함수를 정의할 때 사용했던 fun 예약어나 함수이름을 명시하지 않고 축약해 선언한다.

// 기존 함수 선언
fun 함수이름 (매개변수) { ... }

// 람다함수 선언
{매개변수 -> ...}

람다함수는 -> 키워드를 기준으로 왼쪽은 매개변수, 오른쪽에는 함수의 내용을 명시한다. 매개변수로 타입을 선언해야 하지면 생략할 수 있다.

val stringLengthFunc = { num1: Int, num2: Int -> // Int는 생략 가능!
    num1 + num2
}

코드의 중복을 막고 여러번 반복해서 사용하기 위한 방법이 기존 함수였다면, 람다는 간편하게 사용할 수 있는 일회용 함수라고 생각하면 된다. 그렇기에 람다함수는 아래 예제와 같이 어디서나 호출이 가능하다.

printIn("result : ${{ num1: Int, num2: Int ->
    num1 + num2
}(2, 3)}")

// 어디서나 호출 가능하다.
// result : 5

 

람다식은 변수의 타입으로도 선언될 수 있다. 일반적인 변수 선언식은 아래와 같다.

val stringLengthFunc : Int = 10 // Int 타입의 변수

람다식이 하나의 타입(함수타입) 으로써 Int를 대신해 변수를 설명해준다.

// stringLengthFunc 는 String 을 매개변수로 받고 Int를 반환하는 함수타입이며,
// {}의 내용을 대입받는다.

val stringLengthFunc: (String) -> Int = { input ->
    input.length
}

위 람다식의 결과를 가져오려면 이름이 있는 함수처럼 호출해야 한다.

val stringLengthFunc: (String) -> Int = { input ->
    input.length
}

val stringLength: Int = stringLengthFunc("Android")

함수 타입을 여러번 정의해야 할 때 typealias 키워드를 사용하면 중복을 방지할 수 있다.

typealias mType = (String) -> Int

val stringLengthFunc1: mType = { input -> input.length }
val stringLengthFunc2: mType = { input -> input.length }

 

4. 익명함수 (Anonymous Function)

람다식은 리턴 타입을 자동으로 유추할 수 있기 때문에 리턴 타입을 지정해야 할 필요가 없다. 만약 리턴 타입을 지정해야 한다면 익명함수를 사용한다. 익명함수는 기본함수와 거의 동일하지만 함수명이 없다.

// 익명함수를 사용하는 두 가지 예
val anonymousFunction = fun (x: Int, y: Int): Int = x + y

val anonymousFunction = fun (x: Int, y: Int): Int {
    return x + y
}

val result: Int = anonymousFunction(2, 3)

람다식return문을 사용할 수 없기에 조건문을 통해 처리를 종료하고 싶은 경우 사용하기 애매하다.

val stringLengthFunc: (String) -> Int = { input ->
    if (input.length > 5) {
    	return input.length // error 발생
    }
}

이 때 익명함수를 사용하는 것이 좋다.

val stringLengthFunc = fun(input: String): Int {
    if (input.length > 5) {
    	return input.length
    }
}
728x90
반응형

댓글