람다

kwang·2023년 3월 24일
0

Kotlin

목록 보기
1/6

람다 시작하기

코틀린에서 사용하는 람다에 대해 알아보자

람다는 다른 함수에 넘길 수 있는 작은 코드 조각을 뜻한다.
따라서 공통코드를 작성해놓고 다른 곳에서 공통으로 사용 가능하다.

우선 코틀린에서 컬렉션에 관련 제공되는 람다가 적용된 메서드를 활용해보자
아래 코드예제를 보면 Person을 원소로 가지는 리스트에서 최대 나이인 사람을 찾는 예제이다.

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

fun findTheOldest(people: List<Person>) {
    var maxAge = Int.MIN_VALUE
    var theOldest: Person? = null
    for (person in people) {
        if (person.age > maxAge) {
            maxAge = person.age
            theOldest = person
        }
    }
    println(theOldest)
}

코틀린에서 제공하는 기능을 이용하면 직접 작성한 findTheOldest() 메서드가 .maxBy{} 단 한 줄로 표현할 수 있다.

단순한 예제만 봐도 람다를 활용한 공통코드를 사용하는게 훨씬 편해보인다.

람다 식의 기본 문법에 대해 잠깐 알아보고 지나가보자

fun main() {
    val sum = { x: Int, y: Int -> x + y}
    println(sum(1, 2))
}

람다식의 기본 선언 문법이다.
->를 기준으로 왼쪽은 파라미터 오른쪽은 본문이 된다.
예제와 같이 코틀린트 변수에 람다를 할당할 수 있다.

다시 최대 나이를 구하는 예제로 돌아보자
여기서 maxBy{}는 사실 maxBy({})와 같이 람다를 파라미터로 받는 메서드이다.
코틀린에서는 마지막 파라미터로 람다가 온다면 중괄호 밖으로 뺄 수 있는 특징이 있다. 그러고 나면 중괄호는 생략이 가능하다. 따라서 아래와 같은 형태로 변화한 거라 볼 수 있다.
maxBy({}) -> maxBy(){} -> maxBy{}

따라서 세 가지 방법중 어떠한 방법을 써도 문제없다. 다만 마지막 람다만 작성해주는 방식이 제일 가독성이 좋아보인다!

그리고 또 하나 눈여겨봐야되는 점은 'it'이라는 파라미터다.
it은 람다에서 자동으로 생성되는 파라미터의 이름이다. 따라서 타입추론이 지원되는 코틀린에서 컴파일러가 타입추론을 못하지 않는 이상 람다 파라미터를 명시하지 않고 it을 통해 사용할 수 있다.

다만 주의할 점은 람다안에 람다가 중첩되는 경우 it이 어느 파라미터를 가리키는 지 불분명해보여 가독성이 떨어질 수 있어 중첩되는 경우에는 파라미터를 명시적으로 사용하자!

또한 람다 안에서 바깥의 변수에 대해서 접근이 가능하다. 이러한 경우 변수의 생명주기가 달라질 수 있다.

이 말은 메서드안에 람다가 선언될 경우 람다가 메서드의 멤버 변수에 대해서 관여하고 이러한 람다를 메서드가 반환하게 되면 메서드가 종료되도 람다는 로직에서 이어서 사용되므로 메서드의 멤버 변수는 소멸되지 않고 람다내에서 계속해서 사용 가능하다.

이를 람다가 포획한 변수라고 한다.

0개의 댓글