Hello

익명함수, 인라인함수, crossinline 키워드

by 볼빵빵오춘기

익명함수(Anonymous Function)와 람다식 비교

  • 익명함수 : 이름이 없는 함수로, 일반 함수 형식을 띄지만 이름 없이 변수에 할당하여 사용한다.
  • 람다식 : 함수형 표현으로, return, continue, break 등을 직접 사용할 수 없다.
  • 라벨(Label)을 사용한 반환 처리: @라벨명을 통해 특정 위치로 제어 흐름 이동 가능하다.
val add = fun(x, y) = x + y
val add2 = { x: Int, y: Int -> x + y }

 

인라인 함수 기본

  • 인라인 함수 : 호출되는 위치에 함수 본문을 복사하여 성능 향상시킨다.
  • 너무 긴 코드는 인라인화 시 오히려 코드 부피 증가한다.
  • noinline 키워드로 비인라인 지정 가능하다.
inline fun shorFunc(x: Int, out: (Int) -> Unit) {
    println("함수 호출 전")
    out(x)
    println("함수 호출 후")
}

 

인라인 함수와 비지역 반환

  • 비지역 반환 (Non-local Return) : 람다식 내 return을 통해 호출한 함수 자체를 종료시킨다.
  • 인라인 함수 안에서만 가능하다.
inline fun shortFunc1(x: Int, out: (Int) -> Unit) {
    println("함수 호출 전")
    out(x) // 여기서 return이 발생하면 이후 코드 실행 안됨
}

 

crossinline 키워드

  • crossinline : 람다식 내 return 사용 금지한다.
  • 주로 다른 함수에 람다식을 전달할 때 비지역 반환 방지 용도로 사용된다.
inline fun shortFunc2(x: Int, crossinline out: (Int) -> Unit) {
    println("함수 호출 전")
    out(x)
    println("함수 호출 후")
}

 

확장 함수 (Extension Function)

  • 기존 클래스에 새로운 함수를 추가할 수 있다.
  • 멤버 함수와 이름이 같을 경우, 멤버 함수가 우선 호출된다.
fun String.getLongString(target: String): String = if (this.length > target.length) this else target

 

중위 함수 (Infix Function)

  • 멤버 또는 확장 함수이며, 하나의 매개변수만 가진다.
  • infix 키워드로 선언하며 객체 함수이름 인자 형식으로 호출 가능하다.
infix fun Int.multiply(x: Int): Int = this * x
println(3 multiply 10)

 

재귀 함수와 꼬리 재귀

  • 재귀 호출 시 무한 루프 방지를 위한 탈출 조건 필요하다.
  • tailrec 키워드로 스택 오버플로우 방지 가능하다.(컴파일러가 반복문으로 최적화)
fun factorial(n: Int): Long = if (n == 1) 1 else n * factorial(n - 1)

 

블로그의 정보

Hello 춘기's world

볼빵빵오춘기

활동하기