ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Kotlin] 고차함수와 람다함수
    코틀린 공부/코틀린 기초 2024. 5. 22. 11:22

    1. 람다 함수란?

    람다 함수는 일반 함수와 다르게 fun 키워드도 사용하지 않으며 함수 이름도 없이 변수에 대입해서 사용한다. (익명 함수)

    // 일반적인 함수 선언 방식
    fun plus(a: Int, b: Int) : Int {
        return a + b
    }
    // 람다 함수 선언 방식
    val sum = {a:Int, b:Int -> a+b}

     

    위의 plus함수는 일반적인 함수의 선언 방식이고

    아래 sum에 할당된 것이 람다 함수이다.  

    1-1 람다 함수 규칙

    • { ... } 로 표현한다.
    • { ... } 안에 -> 가 있으면 왼쪽은 parameter, 오른쪽은 함수의 본문이다. 
    • 함수의 return 값은 함수 본문의 마지막 표현식이다. 

    즉 위에서 sum 에는 a+b의 값이 할당된다. 

    1-2 선언 방법

    val sum = {a:Int, b:Int -> a+b}
    sum(10, 20)

     

    익명함수 매개변수 a,b에 각각 10, 20이 할당되어 있으며 결과 값으로는 a+b가 되어 있기 때문에 sum(10,20)은 30을 return 할 것이다. 

    1-3 매개변수 없을때

    매개변수가 없다면 왼쪽부분과 -> 화살표를 생략할 수 있다. 

    val print = {
        val a = 1
        val b = 3
        a+b
    }

     

    print의 값은 a+b의 값인 4가 될것이다.

    1-4 람다 함수 타입

    - 코틀린의 타입 추론으로 인해 변수 타입을 지정하지 않아도 람다를 변수에 대입할 수 있다. 

    val sum1 = { a: Int, b: Int -> a + b }
    println("1 : sum ${sum1(2, 3)}") // 1 : sum 5

     

    - 타입 선언을 추가하면 아래와 같은 방식으로도 사용 가능하다.

    val sum2: (Int, Int) -> Int = { a, b -> a + b }
    println("2 : sum ${sum2(4, 6)}") // 2 : sum 10

     

    - 코틀린에는 아무것도 반환안하는 Unit 타입이 있다. 일반 함수에서는 아무것도 반환을 안할 경우 생략이 가능하지만 람다함수 에서는 반드시 추가해줘야 한다. 

    val sum3 = { a: Int, b: Int -> println("${a+b}") }
    val sum4: (Int, Int) -> Unit = { a, b -> println("${a+b}")}

     

    2. 고차함수란?

    고차 함수란 다른 함수를 parameter로 받거나 함수를 반환하는 함수다.

    고차함수에 람다 함수 활용하는 방식으로 활용된다.

    그리고 코틀린에서 모든 함수를 고차함수로 사용 가능하다. 

    2-1 인자로 받은 함수 호출

    함수를 인자 형식으로 넘겨주려면 인자에 아래와 같이 넘겨주면 된다. 

    이름 : (고차함수 인자 타입) -> 반환타입
    fun highOrderFunctionA(function: (String) -> Unit) {
        function("B")
    }

     

    만들어준 highOrderFunctionA를 사용 하려면 아래와 같이 고차함수를 만들고 넣어 줄 수 있다. 

    val higherFun:(String) -> Unit = {str:String -> println(str)}
    highOrderFunctionA(higherFun)

     

    인자로 넘겨주는 고차함수의 타입을 생략해도 된다고 해서 생략하고 인자로 넘겼지만 컴파일 오류가 생겼다.

    인자로 넘길때 Unit을 제외한 다른 타입은 타입 선언을 생략해줘도 되는 것 같지만 Unit은 반드시 선언이 필요한것 같다. 

    2-2 일반함수 대입 방법

    fun normalFunction(name: String) {
        println("my name is $name")
    }
    highOrderFunctionA(::normalFunction)

     

    앞에 '::' 을 붙여주면 고차함수처럼 사용 가능하다. 

Designed by Tistory.