언어/Kotlin

[Kotlin] 함수 유형 및 람다 표현

implement 2023. 3. 24. 12:00
728x90

Kotlin은 함수를 데이터 유형으로 간주할 수 있고 함수를 변수에 저장하고 저장한 함수를 다른 함수에 인수로 전달하며 다른 함수에서 함수를 반환할 수 있다.

 

변수에 함수 저장

함수를 값으로 참조하려면 함수 참조 연산자 :: 를 사용해야 한다.

ex)

fun main() {
    val name = ::method
    name()      //함수가 저장된 변수는 함수처럼 ()를 붙여줘야 함
    method()    
}

fun method() {
    println("메서드")
}

출력 : "메서드"

"메서드"

fun main() {
    val name = ::method
    val c = name()
    println(c)
    val d = method()
    println(d)
    
}

fun sum(a: Int, b: Int): Int {
    return a+b
}

출력 : 3

7

람다 표현식을 통한 함수 정의

val, var로 변수를 만들고 중괄호를 활용하여 함수 정의를 할 수 있다.

fun main() {
    val name = {
        println("메서드")
    }
    name()
}
fun main() {
    val name1 = name2
    name1()
}

val name2 = {
    println("메서드")
}

매개변수가 있는 함수의 람다 표현식을 통한 정의는 다음의 함수의 데이터 타입을 먼저 알아야 한다.

 

함수 변수의 데이터 타입

함수가 변수에 저장될 수 있으므로 함수에도 데이터 타입이 있다.

(매개변수) -> return타입

매개변수가 없다면 괄호를 비워두고, 반환값이 없다면 Unit을 쓰면 된다.

ex)

fun sum(a: Int, b: Int): Int {
    return a+b
}

sum 함수의 타입 : (Int, Int) -> Int 

fun printD() {
    println("D")
}

sum 함수의 타입 : () -> Unit

 

null 허용의 함수 데이터 타입

데이터 형에 물음표를 붙여주면 된다.((매개변수) -> return타입)?

 

람다 표현식을 통한 매개변수가 있는 함수 정의

만약 두개의 정수형 매개변수를 필요로 하고 정수형을 반환하는 함수의 타입은 다음과 같다.

(Int, Int) -> Int

val 함수이름: 함수타입 = { 매개변수1, 매개변수2, ... ->

    함수내용

}

ex)

fun main() {
    val sumFunction: (Int, Int) -> Int = { a, b ->
        a+b
    }
    print(sumFunction(1, 2))

출력 : 3

 

매개변수 이름 생략

매개변수가 하나 있다면 $it을 사용하여 매개변수 부분을 지울 수 있다.

fun main() {
    val 함수이름: (Int) -> String = {
        "$it"
    }
    println(함수이름(7))
}

출력 : 7

 

람다 표현식 함수에 직접 전달

fun main() {
    val sumFunction: (Int, Int) -> Int = { a, b ->
        a+b
    }
    val calFunction = ::calculator
    calFunction(true, sumFunction)
    calFunction(false, sumFunction)
}

fun calculator(isOn: Boolean, sum: (Int, Int) -> Int) {
    if (isOn) {
        println(sum(1, 2))
    } else {
        println("계산기가 꺼져있습니다.")
    }
}

sumFunction이라는 변수를 선언하지 말고 직접 calFunction이라는 함수에 함수를 직접 전달 할 수 있다.

fun main() {
    val calFunction = ::calculator
    calFunction(true, { a, b -> a+b })
    calFunction(false, { a, b -> a+b })
}

fun calculator(isOn: Boolean, sum: (Int, Int) -> Int) {
    if (isOn) {
        println(sum(1, 2))
    } else {
        println("계산기가 꺼져있습니다.")
    }
}

매개변수와 람다가 헷갈릴 수 있으므로 보통은 후행 람다 문법을 사용한다. 후행 람다 문법이란 람다를 닫는 괄호 다음에 람다 표현식을 배치하는 법이다. 기능의 차이는 없다.

fun main() {
    val calFunction = ::calculator
    calFunction(true) { a, b -> a+b }
    calFunction(false) { a, b -> a+b }
}

fun calculator(isOn: Boolean, sum: (Int, Int) -> Int) {
    if (isOn) {
        println(sum(1, 2))
    } else {
        println("계산기가 꺼져있습니다.")
    }
}

 

수를 매개변수로 이용하는 함수

fun main() {
    val calPrintFunction: (Any) -> Unit = { calSymbol ->
        println("${calSymbol}에 대한 함수를 생성합니다.")
    }
    val calFunction1 = calculator("sum", calPrintFunction)	//함수 전달
    println(calFunction1(1,3))
}

fun calculator(calType: String, calPrint: (Any) -> Unit): (Int, Int) -> Int {//함수 매개변수, 반환
    val symbol =  when (calType) {
        "sum" -> "+"
        "mul" -> "*"
        "sub" -> "-"
        else -> println("잘못 입력")
    }					//calType에서 계산 종류에 따라 기호 반환
    calPrint(symbol)	//함수실행
    val calFunction: (Int, Int) -> Int = when (calType) {
        "sum" -> { a, b -> a+b}
        "mul" -> { a, b -> a*b}
        "sub" -> { a, b -> a-b}
        else -> {a, b -> 0}
        }               //calType종류에 따라 함수 생성
    return calFunction	//함수 반환
}

 

참고자료

https://developer.android.com/codelabs/

반응형