본문 바로가기
2학년 2학기/모바일 소프트웨어 - 코틀린

람다식(2) - it, _ 사용

by print_soo 2024. 10. 10.

람다식의 타입 생략

람다식을 선언했을 때 타입을 선언할 수 있는 경우가 있다.

 

 

타입을 생략하지 않은 경우

val myLambda:(Int, Int) -> Int = {a: Int, b: Int -> a+b}

 

람다식 자체의 타입을 생략하는 경우 (일반적으로 많이 사용하는 경우)

val myLambda = {a: Int, b: Int -> a+b}

 

람다식 내부 입력 변수 타입을 생략하는 경우

val myLambda:(Int, Int) -> Int = {a, b -> a+b}

 

 


 

 

일반적인 함수와 람다식 사용의 차이

 

//일반적인 함수
fun myFun(i: Int): Int = i * 10

fun main() {
    val times = ::myFun
    println(times(2)) //20
}

 

//람다식
fun main() {
    val times = { x: Int -> x * 10 }(2)
    println(times) //20
}

 

일반적인 함수는 참조된 변수를 통해서 값을 입력해야하지만, 람다식은 람다식에서 바로 값을 입력할 수 있다는 차이점이 있다.

 

 

 

 


 

 

 

고차함수의 마지막 형식 인자가 람다식인 경우

 

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

fun main() {
    val result = highOrderFunc(4, 5, { x, y -> x + y })
}

 

고차함수에 인자를 전달할 때는 위와 같이 사용할 수 있다.

하지만 고차함수의 마지막 인자 값이 람다식이라면 람다식을 바깥으로 뺄 수 있다.

 

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

fun main() {
    val result = highOrderFunc(4, 5){ x, y -> x + y }
}

 

 

 

 


 

 

 

 

함수의 인자가 람다식 하나인 함수의 사용

함수의 마지막 인자가 람다식이라면 바깥으로 뺄 수 있다고 했다.

근데 인자 자체가 한개인 함수에서 그 인자가 람다라면 어떻게 될까?

 

//인자가 있는 람다식을 받는 고차함수
fun func(pass: (String) -> String){
    println(pass("Hello"))
}

//인자가 없는 람다식을 받는 고차함수
fun func2(noParam: () -> String){
    println(noParam())
}

fun main() {
    func(){s: String  -> "$s Kim"} //Hello Kim
    func2(){"Hello Kim"} //Hello Kim
}

 

이렇게 함수 바깥으로 람다식을 뺄 수 있는데 저기서 더 생략할 수 있는 방법이 있다. ()를 생략할 수 있다. 따라서 아래와 같이 작성할 수 있다.

 

 

//인자가 있는 람다식을 받는 고차함수
fun func(pass: (String) -> String){
    println(pass("Hello"))
}

//인자가 없는 람다식을 받는 고차함수
fun func2(noParam: () -> String){
    println(noParam())
}

fun main() {
    func{s: String  -> "$s Kim"} //Hello Kim
    func2{"Hello Kim"} //Hello Kim
}

 

 

 


 

 

 

 

it: 람다식의 형식 인자가 하나뿐일 때

 

fun convert(s: String, lower: (String) -> String): String {
    return lower(s)
}

fun main() {
    val hello = "Hello, Kotlin!"
    println(convert(hello){s: String -> s.lowercase()})
}

 

람다 식의 인자가 하나 뿐인 경우에는 위의 형식과 같이 사용할 수 있다.

하지만 저 형식을 더 생략할 수 있는 경우가 있다.

 

 

 

fun convert(s: String, lower: (String) -> String): String {
    return lower(s)
}

fun main() {
    val hello = "Hello, Kotlin!"
    println(convert(hello){it.lowercase()})
}

 

이렇게 it을 사용해서 입력되는 변수명, 타입을 한번에 사용할 수 있다.