[Kotlin][학습노트] 다양한 함수의 형태

tora·2021년 7월 11일

1. 익명함수

  • 이름이 생략된 형태의 함수
  • fun (매개변수: 자료형, ...) {... }
  • 임시적으로, 람다식에 함수를 이용한 처리가 필요할 때 사용
    (람다식 표현으로는 return, break, conitnue 같은 흐름 제어가 어려우므로)

2. 인라인(inline) 함수

  • 컴파일 시 호출되는 곳에 내용을 모두 복사하는 형태의 함수
  • inline fun ~
  • 함수의 분기 없이 처리되므로 성능이 증가됨
  • 코드를 모두 복사하는 형태이기 때문에, inline 함수 내부에서 연산을 수행하기보다는 필요한 연산내용을 넣은 람다식을 매개변수로 전달하는 방식이 바람직함
  inline fun test(a:Int, lam:(Int)->Int): Unit = println(lam(a))
  inline fun test2(a:Int): Unit = println(a + 3)	//성능 경고
  fun main() {
      test(4, {it + 3})
      test2(4)
  }
  • noinline : 매개변수 람다식이 복사가 아닌 호출방식으로 그대로 있도록 하는 선언
    -> inline fun 함수명(..., noinline 람다식: ~)
  • crossinline : 매개변수 람다식 내부에서 return 사용 불가능하도록 하는 선언
    (inline 함수에 전달하는 람다식에서 return 하면 람다식 뿐 아니라 함수전체 return되어버림)
    -> inline fun 함수명(..., crossinline 람다식: ~)
    -> crossinline 사용 시 컴파일에러 : 'return' is not allowed here

3. 확장함수

  • 기존 클래스의 멤버함수를 추가하는 형태의 함수
  • fun 대상클래스.추가할함수명(...) ...
    -> 기존 클래스 수정 없이 사용 가능한 이점이 있다.

4. 중위함수

  • 클래스의 멤버함수(또는 그 확장함수)를 .과 () 없이 호출가능하도록 선언한 함수
  • infix fun ~
    -> 하나의 매개변수를 가질 때에만 중위함수로 선언 가능
  infix fun String.getSumLength(a : String): Int = this.length + a.length
  fun main() {
      val str: String = "hi"
      println(str.getSumLength("hello"))	//7
      println(str getSumLength "hello" )	//7
}

5. 꼬리재귀함수

  • 재귀호출했을 때 스택에 다시 쌓이는 방식이 아닌 꼬리를 무는 형태의 함수
  • tailrec fun ~

0개의 댓글