[Kotlin/코틀린] 고차 함수와 인라인 함수

SoyoungLee·2021년 3월 29일
0
post-thumbnail

💌 고차 함수와 인라인 함수

📌 고차 함수

💜 정의

  • 매개변수로 함수를 전달받거나 함수를 반환하는 함수
fun hoFun(x1: Int, argFun: (Int) -> Int){
    val result = argFun(10)
    println("x1 : $x1 , someFun : $result")

}
fun main(args: Array<String>){
    hoFun(10, {x->x*x})
}

🖥
x1 : 10 , someFun : 100

💜 코틀린 API의 유용한 고차 함수

- run() 함수

  • 단순히 람다 실행 후 결괏값 얻는 목적
  • 객체의 멤버에 접근하기 위해 사용

- apply() 함수

  • run() 함수와 차이점 : apply() 함수를 적용한 객체를 반환

- let() 함수

  • 자신을 호출한 객체를 매개변수로 전달받은 람다 함수에 매개변수로 전달

📌 인라인 함수

💜 인라인 함수

- inline

  • 함수가 호출되는 곳에 내용을 모두 복사
  • 함수의 분기 없이 처리 -> 성능 증가
  • 코드가 복사되므로 내용이 많은 함수에 사용하면 코드가 늘어남
inline fun hoFunTest(argFun: (x1: Int, x2: Int) -> Int){
    abc
}
fun main(args: Array<String>){
    hoFunTest {x1, x2 -> x1+x2}		// 본문 abc로 복사됨
}

💜 노인라인

- noinline

  • 일부 람다식 함수를 inline 되지 않게 하기 위해
inline fun shortFun(a: Int, noinline out: (Int) -> Unit){
    println("hello")
    out(a)
}

fun main(){
    shortFun(3){
        println("a: $it")
    }
}

🖥
hello
a: 3

💜 논로컬 반환 (비지역 반환)

  • 람다 함수 내에서 람다 함수를 포함하는 함수를 벗어나게 하는 기법
inline fun shortFun(a: Int, noinline out: (Int) -> Unit){
    println("hello")
    out(a)	// out 및 shortFun도 리턴시켜버려서 아래문구 출력 안됨
    println("goodbye")
}

fun main(){
    shortFun(3){
        println("a: $it")
        return 
    }
}

🖥
hello
a: 3

크로스 인라인

- crossinline

  • 비지역 반환을 방지 -> 에러
inline fun shortFun(a: Int, crossinline out: (Int) -> Unit){
    println("hello")
    out(a)	// out 및 shortFun도 리턴시켜버려서 아래문구 출력 안됨
    println("goodbye")
}

fun main(){
    shortFun(3){
        println("a: $it")
        return 
    }
}

💜 라벨로 반환

  • 함수 자체를 종료하지 않고 람다함수 앞에 라벨을 지정해 그 부분만 벗어나게 함
val array = arrayOf(1, -1, 2)
inline fun arrayLoop(){
    println("loop top")
    array.forEach aaa@{
        if(it<0) return@aaa
        println(it)
    }
    println("loop bottom")
}
fun main(){
    arrayLoop()
}

🖥
loop top
1
2
loop bottom

- 자동 추가 label 이용

 array.forEach {
        if(it<0) return@forEach
        println(it)
    }
    
hoTest {
        if(it.length<4) return@hoTest
        println(it)
    }

📌 클로저

  • 함수 호출시 발생하는 데이터를 호출 후에도 유지해 이용하는 기법
profile
Android Developer..+ iOS 슬쩍 🌱 ✏️끄적끄적,,개인 기록용 👩🏻‍💻

0개의 댓글