코딩메이트 디모님의 강좌를 기반으로 하여 학습한 내용입니다 > 보러가기 <
람다함수는 이전부터 써 왔던 거라 별로 어렵지는 않았는데..
뭐랄까.. 이번에 공부하면서 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 |