[코틀린기초] 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}
  

인라인 함수

함수가 호출되는 곳에 내용을 모두 복사 함수의 분기가 없으므로 성능이 증가!

단 코드가 복사되므로 코드양이 증가할 수 있음

  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