ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Kotlin] 람다
    Kotlin 2021. 3. 29. 16:04
    반응형

    람다(lambda)는 다른 함수에 넘길 수 있는 작은 코드 조각을 뜻한다.

     

    data class Person(val name : String, val age : Int)
    
    fun findTheOldest(people : List<Person>){
        var maxAge = 0 // 연장자 나이
        var theOldest : Person? = null // 연장자를 저장할 변수
        for(person in people){
            if(person.age > maxAge){
                maxAge = person.age
                theOldest = person
            }
        }
        println(theOldest)
    }

    람다를 사용하지 않고 가장 연장자인 사람을 찾는 코드를 작성한다면 위와 같은 코드처럼 작성 할 수 있다.

    하지만 코드가 짧지않고 비교연산자를 반대로 쓰는등 실수가 생길 수 있다.

     

    fun main() {
        val people = listOf(Person("Alice",29),Person("Bob",31))
        println(people.maxBy {it.age })
    }

    코틀린의 라이브러리중 maxBy를 사용하면 쉽게 연장자를 구할 수 있다.

     

    public inline fun <T, R : Comparable<R>> Iterable<T>.maxBy(selector: (T) -> R): T?

    maxBy는 가장 큰 원소를 찾기 위해 비교에 사용할 값을 돌려주는 함수를 인자로 받는다.

    라이브러리를 보면 (selector : (T) -> R)에서 함수를 인자로 받는 것을 알 수 있다.

    이런 식으로 함수나 프로퍼티를 반환하는 역할을 수행하는 람다멤버 참조로 대치할 수 있다.

     

    { x: Int, y: Int -> x + y }
    
    val sum = { x: Int, y: Int -> x + y }

    람다는 항상 중괄호 사이에 위치하며 x,y 같은 인자를 가질수 있고 화살표로 인자 목록람다 본문을 구분해준다.

    또한, 변수에 람다 식을 저장하여 사용할 수도 있다.

    인자의 타입은 생략할 수 있지만, 변수에 저장하여 사용할 때는 타입 추론이 불가능 하므로 타입을 반드시 명시 해줘야한다.

    val sum = { x: Int, y: Int ->
            println("$x and $y")
            x + y
        }

    람다의 본문이 여러 줄로 이뤄진 경우 본문의 맨 마지막에 있는 식이 람다의 결과 값이 된다.

     

    코드 블록을 다른 함수에게 인자로 넘기는 방법 말고 넘기려는 코드가 이미 함수로 선언된 경우에는 멤버 참조를 사용 할 수 있다. 이중 콜론을 사용하면 멤버참조를 사용할 수 있다.

    멤버 참조는 인자나 메소드를 단 하나만 호출하는 함수 값을 만들어준다.

    val getAge = Person::age
    
    val getAge = { person: Person -> person.age }

    Person은 클래스, age는 멤버를 뜻한다.

    첫번째 줄 코드 와 두번째 줄 코드는 같은 역할을 한다.

     

    • 람다를 사용하면 코드 조각을 다른 함수에게 인자로 넘길 수 있다.
    • 람다가 함수 인자인 경우 괄호 밖으로 빼낼 수 있고, 람다의 인자가 하나뿐인 경우 it이라는 이름으로 부를 수 있다.
    • 람다 안에 있는 코드는 그 람다가 들어있는 바깥 함수의 변수를 읽겨나 쓸 수 있다.
    • 메소드, 생성자, 프로퍼티의 이름 앞에 ::을 붙이면 각각에 대한 참조를 만들 수 있다.

     

    반응형

    'Kotlin' 카테고리의 다른 글

    [Kotlin] 코틀린이란  (0) 2021.04.02
    [Kotlin] 스트림 함수(2)  (0) 2019.10.17
    [Kotlin] 스트림 함수(1)  (0) 2019.10.17
    [Kotlin] for문  (0) 2019.09.27
    [Kotlin] 자료형  (0) 2019.09.27

    댓글

Designed by Tistory.