고차 함수와 람다식

Anna·2024년 5월 28일
0

코틀린

목록 보기
9/28
post-thumbnail

고차 함수의 형태

✍️ 인자에 함수를 사용.kt

fun main()
{
    val res1 = sum(3, 2)  //일반 인자
    val res2 = mu1(sum(3,3),3)  //인자에 함수를 사용

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

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


//결과
res1 : 5, res2 : 18

✍️ 함수의 변환값으로 함수 사용.kt

fun main()
{
    println("funcFunc : ${funcFunc()}") //
}

fun sum(a: Int, b: Int) = a + b
fun funcFunc(): Int   //함수의 변환값으로 함수 사용
{
    return sum(2, 2)
}


//결과
funcFunc : 4

✍️ 다식이 할당된 변수.kt

fun main()
{
    var result: Int
//일반 변수에 람다식 할당
    var multi = {x:Int, y:Int -> x*y}
//람다식이 할당된 변수는 함수처럼 사용가능
    result = multi(10, 20)
    println(result)
}

✍️ 람다식을 매개변수와 인자로 사용한 함수.kt

fun main()
{
    var result : Int 
    
    //람다식을 매개변수와 인자로 사용한 함수
    result = highOrder({x,y -> x + y},10 ,20) 
    println(result)
}

fun highOrder(sum: (Int, Int) ->Int, a: Int, b: Int) :Int
{
    return sum(a, b)
}


변수에 지정된 람다식

람다식의 선언 자료형과 람다식의 매개변수 안에의 자료형 둘 중 하나는 남겨야한다.
✍️ 자료형의 생략.kt

//생략되지 않은 전체 표현
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} 

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

//반환 자료형 없을 때
//()안에 전달할 인자가 없기 때문에 화살표가 사라지고 해당 처리할 내용만 입력
val greet : ()->Unit = {println("Hello World")} 

//매개변수가 하나있을 때
val square : (Int)->Int = {x -> x * x}

✍️ 람다식의 처리 내용.kt

val multi2 = {x: Int, y: Int ->
	println("x * y")
    x * y     //마지막 표현식이 반환됨
}

✍️ 람다식 안에 람다식이 있는 경우.kt

val nestedLambda: ()->()->Unit = { { println("nested") } }

✍️ 선언부의 자료형 생략.kt

val greet = {println("Hello World!")} //추론 가능
val square = {x: Int -> x * x}  //선언 부분을 생략하려면 x의 자료형을 명시
val nestedLambda = { { println("nested") } }  //추론 가능

람다식과 고차함수 호출하기

람다식과 고차함수를 호출하는 방식은 값에 의한 호출이름에 의한 호출이 있다.

값에 의한 호출

함수가 인자로 전달될 경우
-> 람다식 함수는 값으로 처리되어 즉시 함수가 수행된 후 값을 전달
✍️ 값에 의한 호출.kt

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   //마지막 표현식 문장의 결과가 반환
    }


//결과
lambda function
callByValue function
true

✍️ 이름에 의한 호출.kt

fun main()
{
    val result = callByName(otherLambda)  //람다식 이름으로 호출
    println(result)
}

fun callByName(b: () -> Boolean): Boolean
{
    println("callByName function")
    return b()
}

val otherLambda: () -> Boolean = {
    println("otherLambda function")
    true
}


//결과
callByName function
otherLambda function
true

이것을 잘 이용하면 상황에 맞춰 즉시 실행할 필요가 없는 코드를 작성하는 경우, 이름에 의한 호출 방법을 통해 필요할 때만 람다식 함수가 작동하도록 만들 수 있다.

✍️ 다른 함수의 참조에 의한 호출.kt

//sum은 람다식이 아니다. 
fun sum(x: Int, y: Int) = x + y

//sum 앞에 :: 붙이면 람다식 형태로 호출된다. 
funcParam(3, 2, ::sum)  //funcParam(3, 2, sum) > 오류 코드 
...
//c는 람다식 사용
fun funcParam(a: Int, b: Int, c: (Int, Int)->Int):Int
{
	return c(a, b) 
}

✍️참조에 의한 호출 방식.kt

fun main()
{
	//1. 인자와 변환값이 있는 함수
    val res1 = funcParam(3, 2, ::sum)
    println(res1)
	
    //2. 인자가 없는 함수
    hello(::text)   //반환값이 없음 

	//3. 일반 변수에 값처럼 할당
    val likeLambda = :: sum
    println(likeLambda(6, 6))
}

fun sum(a: Int, b: Int) = a+b
fun text(a: String, b: String) = "Hi! $a $b"
fun funcParam(a: Int, b: Int, c: (Int, Int) -> Int): Int
{
    return c(a, b)
}
fun hello(boby:(String,String)-> String) :Unit{
    println(boby("Hello", "World"))
}

✍️매개 변수 없는 람다식 함수.kt

fun main()
{
    //매개 변수 없는 람다식 함수
    noParam({"Hello World!"})
    noParam{"Hello World!"}   //위와 동일 결과, 소괄호 생략 가능
}

//매개변수가 없는 람다식 함수가 noParam 함수의 매개변수 out으로 지정됨
fun noParam(out : () -> String) = println(out())

✍️매개변수가 한 개인 경우.kt

fun main()

{
    OneParam({a -> "Hello World! $a"})
    OneParam{a -> "Hello World! $a"}  //위와 동일 결과, 소괄호 생략 가능
    OneParam{"Hello World! $it"}   //위와 동일 결과, it으로 대체 가능
}

//매개변수가 하나 있는 람다식 함수가 OneParam함수의 매개변수 out으로 지정됨
fun OneParam(out:(String)->String)
{
    println(out("OneParam"))
}

✍️매개변수를 생략하는 경우.kt

//첫 번째 문자열은 사용하지 않고 생략
moreParam{_,b -> "Hello World!" $b"}

0개의 댓글