본문 바로가기

# 02/코틀린

[Kotlin] 고차 함수와 람다식

반응형

fun main () {

val res1 = sum (3,2)                 // 일반 인자

val res2 = mul (sum(3,3), 3)       // 인자에 함수를 사용

println("res1: $res1, res2: $res2")

}


fun sum (a : Int, b : Int ) = a + b

fun mul (a : Int, b : Int ) = a * b




fun main() {

println( "funcFunc : $ {funcFunc()}")

}


fun sum (a : Int, b : Int) = a+b

fun funcFunc() : Int {               // 함수의 반환값으로 함수 사용

return sum(2,2)

}





fun main() {

var result : Int


// 일반 변수에 람다식 할당

val multi = { x : Int, y : Int -> x * y }

// 람다식이 할당된 변수는 함수처럼 사용 가능

result = multi (10, 20)

println(result)

}




변수에 지정된 람다식

val multi : (Int, Int) -> Int  = { x: Int, y: Int -> x * y }


변수를 함수처럼 사용 가능

람다식은 선언 자료형은 람다식 매개변수에 자료형이 명시된 경우 생략 가능

선언 자료형이 명시되어 있으며 생략 가능

함수의 내용과 결과 반환, 표현식이 여러 줄인 경우 마지막 표현식이 반환




표현식이 2줄 이상일 때

val multi2 : (Int, Int) -> Int = { x : Int, y : Int ->

println( " x * y " )

x * y                               // 마지막 표현식이 반환됨

}


자료형의 생략

val multi : (Int, Int) -> Int = {x: Int, y: Int -> x * y}     // 생략되지 않은 전체 표현

val multi = {x: Int, y: Int -> x * y}                          // 선언 자료형 생략

val multi : (Int, Int) -> Int = {x, y -> x * y}               // 람다식 매개변수 자료형의 생략

val multi = {x, y-> x * y}                                     // 에러! 추론이 가능하지 않음



반환 자료형이 없거나 매개변수가 하나 있을 때

val greet : () -> Unit = { println("Hello World!") }

val square : (Int) ->Int = { x -> x * x }



람다식 안에 람다식이 있는 경우 - 복잡해서 자주 사용되진 않음!

val nestedLambda : () -> () -> Unit = {  { println("nested") } }              // 호출시 nestedLambda()() 해줘야됨!


선언부의 자료형 생략

val greet  = { println("Hello World!") }                  // 추론 가능

val square = { x : Int -> x * x }                           // 선언부분 생략하고 x의 자료형 명시함

val nestedLambda = {{ println("nested") }}            // 추론 가능





fun main() {

val result = callByValue ( Lambda() )                 // 람다식 함수를 호출

println(result)

}

fun callByValue( b : Boolean ) : Boolean {

println("callByValue function")

return b

}

val Lambda : () -> Boolean = {

println ( "lambda function" )

true                                                         // 마지막 표현식 문장의 결과가 반환

}

 





fun main() {

val result = callByName (otherLambda)                 // 람다식 이름으로 호출

println(result)

}

fun callByName( b : () -> Boolean ) : Boolean {              // 람다식 함수 자료형으로 선언된 매개변수

println("callByName function")

return b()                                                        // 람다식 함수 호출

}

val otherLambda : () -> Boolean = {

println ( "lambda function" )

true                                                               // 마지막 표현식 문장의 결과가 반환

}

 





반응형