코딩메이트 디모님의 강좌를 기반으로 하여 학습한 내용입니다  > 보러가기 <

 

 

람다함수는 이전부터 써 왔던 거라 별로 어렵지는 않았는데.. 

뭐랄까.. 이번에 공부하면서 JAVA에서 처음으로 interface를 이용한 콜백함수 구현을 처음 알았을 때의 그런 '???' 스러움을 다시 느꼈다. 

'뭐..? 함수 파라미터에 함수를 넣을 수 있어..?'

 

1. 반환값이 없는 함수의 경우

fun main() {
    call(::printOnly)
}

fun call(function:(String) -> Unit) {
    function("Call")
}

fun printOnly(str:String) {
    println("Print Only] > $str")
}
<출력결과>
Print Only] > Call
lambda] > Call

printOnly 함수는 String을 인자로 받는 void형 함수이다.

call 함수는 String을 인자로 받는 void형 함수를 인자로 받는 함수이다.

함수 실행 시 인자값으로 함수를 넘길 때는 ::{함수명} 을 입력해야 한다.

그냥 입력하면 해당 함수의 결과값을 사용한다는 의미라서 에러메세지가 나옴.

 

call함수를 호출하면 call 함수 내부에서 인자로 전달된 printOnly 함수를 실행하게 된다.

 

이 때 미리 선언한 함수가 아니라 람다 함수를 변수로 선언하여 사용할 수도 있다. 아래 예시 참조.

    var lambda:(String)->Unit = {str -> println("lambda] > $str")}
    call(lambda)

 

2. 반환값이 있는 경우

fun main() {
    call2(::returnValue)
}

fun call2(function:(String, Int, Int) -> Int) {
    var sum = function("Call2", 2, 3)
    println("SUM :: " + sum)
}

fun returnValue(str:String, i:Int, j:Int):Int {
    println("returnText] > $str")
    return i+j
}
<출력결과>
returnText] > Call2
SUM :: 5
test] > Call2
SUM :: 5

1번과 별반다르지 않다.

returnValue는 인자로 받은 String을 화면에 출력하고 Int들을 더한 값을 반환하는 함수이다.

call2는 인자로 받은 함수를 실행하고 그 결과를 받아 화면에 출력하는 함수이다.

처음 공부할 때 프로그램이 어떻게 실행되는지 코드를 따라가며 확인하는 게 좋을 것 같다.

 

단, 1번과는 다르게 람다함수에서는 return을 허용하지 않기 때문에 이 경우에는 람다함수 말고 익명함수를 통해 구현할 수 있다.  가능하다 으아아아아아아아아 !!! 가능해!!!! 다음 강의에서 바로 처음부터 나오더라!!!!

 

  1) 람다 함수 사용 : 람다 함수의 마지막 줄이 반환값

   var lambda:(String, Int, Int)-> Int = { str, i, j -> 
           println("lambda] > $str")
           i+j
   }
   
   call2(lambda)

 

  2) 익명 함수 사용 : return으로 반환값을 명시

    val func = fun(s:String, i:Int, j:Int):Int {
         println("test] > $s")
         return i+j
    }
    call2(func)

 

 

 

3. 기타

1) 인자를 받지 않는 경우

val lambda_empty:()->Unit={println("EMPTY LAMBDA")}

lambda_empty()
<실행 결과>
EMPTY LAMBDA

인자를 받지 않는 경우 그냥 실행할 코드만 넣어준다.

 

 

2) 인자가 하나인 경우

인자가 하나인 경우 따로 명시하지 않고 it을 사용해서 파라미터를 사용할 수 있다.

아래 코드는 둘 다 동일한 결과를 보임. (lambda_it에서 str이라는 변수에 한번 더 할당했는데, 그럴 필요 없이 it으로 사용해도 된다.

val lambda_nor:(String)->Unit={
	str-> println("print $str")
}

val lambda_it:(String)->Unit={
	var str:String = it
    println("print $str")
}

오늘 갑자기 모르는 내용이 확 나와서

나는 내가 강의를 빼먹었나? 하고 있었는데

다행히 그건 아니었다.

 

영상만 볼 때는 뭐가 뭔지 잘 몰랐는데

직접 만들다보니 어느정도 이해가 가는 것 같기도 하고..

알다가도 모르겠다 :(

'개발 > Kotlin' 카테고리의 다른 글

코틀린 공부 - 함수(1)  (0) 2021.08.02
코틀린 기초 5 - object  (0) 2020.06.25
코틀린 기초 - 3 (if~else, when)  (0) 2020.06.23
코틀린 기초 - 2 (배열, 반복문)  (0) 2020.06.16
코틀린 기초 - 1  (0) 2020.06.16

+ Recent posts