익명 함수(Anonymous Function)
익명 함수란 일반 함수이지만 이름이 없는 것.
람다식 함수도 이름 없이 구성할 수 있지만 익명 함수는 일반 함수의 이름을 생략하고 사용하는 것.
fun(x: Int, y: Int): Int = x + y // 함수 이름이 생략된 익명 함수
val add: (Int, Int) -> Int = fun(x, y) = x + y
val result = add(10, 2)
val add = fun(x: Int, y: Int) = x + y // 일부 자료형 생략 가능
그렇다면 람다식으로 표기할 수 있는데 굳이 익명 함수를 쓰는 이유는 무엇인가?
람다식에서는 return이나 break, continue처럼 제어문을 사용하기 어렵기 때문.
인라인 함수(Inline Function)
인라인 함수는 이 함수가 호출되는 곳에 함수 본문의 내용을 모두 복사해 넣어 함수의 분기 없이 처리되기 때문에 코드의 성능을 높일 수 있다.
인라인 함수는 코드가 복사되어 들어가기 때문에 내용은 보통 짧게 작성한다.
인라인 함수는 람다식 매개변수를 가지고 있는 함수에서 동작.
보통 함수는 호출되었을 때 다른 코드로 분기해야 하기 때문에 내부적으로 기존 내용을 저장했다가
다시 돌아올 때 복구하는 작업에 CPU와 메모리를 사용한다.(비용이 발생)
fun main() {
demo(1) { x -> x+1 }
demo(2) { x -> x+1 }
}
inline fun demo(a: Int, b: (Int) -> Int){
println(b(a))
}
//2
//3
inline fun demo(a: Int, noinline b: (Int) -> Int){ // noinline으로 람다식 인라인 막기
println(b(a))
}
인라인 함수와 비지역 반환
-
확장 함수(Extension Function)
클래스에 정의된 함수를 멤버 메서드라고 한다.
기존 멤버 메서드는 아니지만 클래스에 내가 원하는 함수를 하나 더 포함시켜 확장하고 싶을 때가 있다.
이때 확장 함수라는 개념을 사용한다.
String 클래스에 나만의 확장 함수 추가하기
fun main(){
val source = "hello world"
val target = "kotlin"
println(source.getLongString(target))
}
fun String.getLongString(target: String): String =
if (this.length > target.length) this else target
// hello world
확장 함수를 만들 때 확장하려는 대상에 동일한 이름의 멤버 함수 혹은 메서드가 존재한다면
항상 확장 함수보다 멤버 메서드가 우선으로 호출된다.
중위 함수
-
꼬리 재귀 함수
-
'코틀린' 카테고리의 다른 글
Do it! 코틀린 프로그래밍, 04-1 조건문 (0) | 2021.08.26 |
---|---|
Do it! 코틀린 프로그래밍, 03-6 함수의 변수의 범위 (0) | 2021.08.26 |
Do it! 코틀린 프로그래밍, 03-4 고차 함수와 람다식의 사례 알아보기 (0) | 2021.08.24 |
Do it! 코틀린 프로그래밍, 03-3 함수와 함수형 프로그래밍 (0) | 2021.08.24 |
Do it! 코틀린 프로그래밍, 03-2 함수형 프로그래밍 (0) | 2021.08.23 |