본문 바로가기
Do it 코틀린 프로그래밍

코틀린 표준함수 (1)

by 차누감 2020. 9. 6.
반응형

코틀린의 표준함수를 이용하면 코드를 더 단수화하고 읽기 좋게 만들어 줍니다. 

표준함수는람다식과 고차함수를 이용해 선언되어 있습니다. 

 

람다식과 고차 함수 복습하기

람다식

val 변수 이름: 자료형 = { 매개 변수[,,] -> 람다식 본문 }
    val sum :(Int, Int) -> Int = { x,  y -> x + y}
    println(sum(1,2))   //  3
    
    val mul: (Int, Int) -> Int = {x, y -> x * y }
    println(mul(2,2))   //  4
    
    // 매개 변수 1개 일 경우, it으로 표기할 수 있음.
    val add:(Int) -> Int = {it +1}
    println(add(1))   //  2

 

추론된 반환 자료형이 Unit이 아닌 경우에는 본문의 마지막 표현식이 반환값으로 처리됩니다.

   val isPositive: (Int) -> Boolean = {
       val isPositive = it > 0
       isPositive
   }
    println(isPositive(1))  //  true
    println(isPositive(-1)) //  false
    

특정 라벨 지정 반환

    val isPOsitiveLabel: (Int) -> Boolean = number@{
        val result = it > 0
        return@number result
    }
    println(isPOsitiveLabel(1))  //  true
    println(isPOsitiveLabel(-1)) //  false

 

고차함수

고차함수는 매개변수로 함수를 받거나 반환할 수 있는 함수입니다.

    fun inc(x : Int): Int{
        return x + 1
    }

    fun high(name:String, body:(Int) -> Int) : Int {
        println("name $name")   
        val x =0
        return body(x)
    }
    println(high("sam",{x -> inc(x + 3)}))
    
    //결과
    //  name sam
    //  4

클로저

람다식을 사용하다 보면 내부 함수에서 외부 변수를 호출하고 싶을 때가 있습니다. 클로저란 람다식으로 표현된 내부 함수에서 외부 범위에 선언된 변수에 접근할 수 있는 개념을 말합니다.

 

클로저 조건

final 변수를 포획한 경우 변수 값을 람다식과 함께 저장한다.
final이 아닌 변수를 포획한 경우 변수를 특정 래퍼(wrapper)로 감싸서 나중에 변경하거나 읽을 수 있게 한다.
이때 래퍼에 대한 참조를 람다식과 함께 저장한다.

아래 코드에서 result는 자신의 유효 범위를 벗어나 삭제되어야 하지만 클로저의 개념에 의해 독립된 복사본을 가집니다.

람다식 반환값은 Unit으로 선언되어 반환되는 값이 없습니다. 하지만 result = x + y와 같이 result에 값을 저장함으로써 포획된 변수 result에 값을 저장할 수 있었습니다.

fun main(){

    val calc = Calc()
    var result = 0  //  외부 변수
    calc.addNum(2,3) {x, y -> result = x + y }  //  클로저
    println(result) //  값을 유지하여 5 출력

}

class Calc{
    fun addNum(a: Int, b: Int, add:(Int, Int) -> Unit){ //  람다식 add에는 반환값이 없음
        add(a, b)
    }
}

 

반응형

댓글