본문 바로가기

# 02/코틀린

[Kotlin] 다른 함수의 참조에 의한 호출

반응형

fun sum ( x : Int, y : Int ) = x + y


funcParam (3, 2, sum)                  // 오류! sum은 람다식이 아님


fun funcParam(a : Int, b : Int, c : (Int, Int) -> Int) : Int {

return c (a, b)

}


funcParam(3, 2, ::sum)                // sum이 람다식이 아닌 경우 이렇게 호출해주면 됨!





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 (body : (String , String) -> String ) : Unit {

println(body("Hello", "World"))

}





매개변수가 없는 경우


fun main() {

// 매개변수 없는 람다식 함수

noParam ( { "Hello Wrold!" } )

noParam  { "Hello Wrold!" }                    // 매개변수가 람다식 하나일 경우만 !!!위와 동일 결과, 소괄호 생략가능

}


// 매개변수가 없는 람다식 함수가 noParam 함수의 매개변수 out으로 지정됨

fun noParam(out : () -> String ) = println(out())




매개변수가 한 개인 경우


fun main() {

// 매개변수가 하나 있는 람다식 함수

oneParam ( { a -> "Hello Wrold! $a" } )

oneParam { a -> "Hello Wrold! $a" }                        // 위와 동일 결과, 소괄호 생략 가능

oneParam { "Hello Wrold! $it" }                               // 위와 동일 결과, it으로 대체 가능

}


// 매개변수가 하나 있는 람다식 함수가 oneParam 함수의 매개변수 out으로 지정됨

fun oneParam(out : (String) -> String ) {

 println(out("OneParam"))

}




매개변수가 두 개 이상인 경우


fun main() {

// 매개변수가 두 개 있는 람다식 함수

moreParam { a, b -> "Hello Wrold! $a $b" }             // 매개변수명 생략 불가

}


// 매개변수가 두 개 있는 람다식 함수가 moreParam 함수의 매개변수로 지정됨

fun moreParam(out : (String, String) -> String ) {

 println(out("OneParam", "TwoParam"))

}




매개변수를 생략하는 방법 ( 디폴드값 있는경우)

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





일반 매개변수와 람다식 매개변수를 같이 사용


fun main() {


// 인자와 함께 사용하는 경우

withArgs("Arg1", "Arg2", { a, b -> "Hello World! $a $b" })

withArgs("Arg1", "Arg2") { a, b -> "Hello World! $a $b" }    // 마지막 인자가 람다식인 경우 소괄호 바깥으로 분리 가능


}


// withArgs 함수는 일반 매개변수 2개를 포함, 람다식 함수를 마지막 매개변수로 가짐

fun withArgs ( a: String, b: String, out : (String, String) -> String ) {

println(out(a, b))

}





두 개의 람다식을 가진 함수의 사용


fun main() {

twoLambda( { a, b -> "First $a $b" }, { " Second $it "})

twoLambda( { a, b -> "First $a $b" } ) { " Second $it " }                // 위와 동일 세개의 람다식이 있는 경우 마지막 것만 뺄 수 있음

}


fun twoLambda ( first : ( String, String ) -> String, second : (String) -> String ) {

println(first( "OneParam", "TwoParam") )

println(second("OneParam"))

}



반응형