-
[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