코틀린

Do it! 코틀린 프로그래밍, 03-5 코틀린의 다양한 함수 알아보기

조요피 2021. 8. 25. 22:30

익명 함수(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

확장 함수를 만들 때 확장하려는 대상에 동일한 이름의 멤버 함수 혹은 메서드가 존재한다면

항상 확장 함수보다 멤버 메서드가 우선으로 호출된다.

중위 함수

-

꼬리 재귀 함수

-