[코틀린기초] 18. 익명함수와 인라인 함수
익명함수
함수가 이름이 없는 것
fun (x:Int, y:Int) : Int = x + y //함수 이름이 생략된 익명 함수
val add:(Int,Int) -> Int = fun(x,y) = x + y // 익명 함수를 사용한 add선언
val result = add(0,2) //add의 사용
//람다식과 매우 흡사하다!!!
val add = fun(x:Int,y:Int) = x + y
val add = {x:Int, y:Int -> x + y}
- 일반 익명함수에서는 return, break, continue 가 사용가능하지만 람다식에서는 어렵다. (라벨 표기법과 같이 사용해야 함)
인라인 함수
함수가 호출되는 곳에 내용을 모두 복사 함수의 분기가 없으므로 성능이 증가!
단 코드가 복사되므로 코드양이 증가할 수 있음
fun main(...){
sub() //sub함수로 분기하지 않고 함수 내용 abc가 그대로 복사됨
}
inline fun sub(...){
abc
}
#### - 다음과 같이 람다식 파라미터를 받는 함수와 같이 사용하도록 권장된다!
inline fun shortFunc(a:Int, out:(Int)-> Unit){
println("Hello")
out(a)
}
fun main(){
shortFunc(3,{a->println("a: $a")})
}
### 인라인 금지
noinline 키워드로 인라인을 방지한다.
inline fun sub(out1L () -> Unit, noinline out2:() -> Unit){}
비지역 반환
람다식 함수를 빠져나오려고 return을 사용하지만, 람다식만 빠져나오는게 아니라 람다식을 매개변수로 받는
함수까지 반환되는 것을 비지역 반환이라고 한다.
inline fun shortFunc(a:Int, out: (Int) -> Unit){
println("Hello")
out(a)
println("Goodbye") //실행이 안됨!!! 비지역 반환
}
fun main(){
shortFunc(a){
println("a:$it")
return
}
}
이를 방지하려면 람다식 매개변수에 crossinline 키워드를 사용하여 return 키워드의 사용을 막는다.
inline fun shortFunc(a:Int, crossinline out:(Int) -> Unit){}
## 확장함수
클래스의 멤버 함수를 외부에서 더 추가할 수 있다.
그러나 원본 클래스를 수정하지는 않고 멤버함수를 추가하는 방식 (기존의 표준 라이브러리를 수정하지않고 확장 가능)
단, 너무 많이 수정하게 되면 멤버함수를 너무 많아 지는것과 같으므로 호환성에 문제가 생길 수 있다.
fun 확장대상.함수명(매개변수,...) : 반환값{
...
return 값
}
### 확장함수 예제
fun String.getLongString(target: String) : String = if(this.length > target.length) this else target