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 ~