본문 바로가기
Language/Kotlin

Kotlin에서 람다의 라벨링

by 시니성 2023. 8. 23.

Kotlin은 함수와 람다를 매우 강력하게 지원하는 언어입니다. 때로는 람다 안에 람다, 또는 여러 개의 람다를 중첩해서 사용하는 경우도 많습니다. 이럴 때, 특정 람다의 return을 원할 때 또는 특정 람다를 참조하고 싶을 때, 람다에 라벨링을 사용하게 됩니다.

라벨링의 필요성

람다 내부에서 return 키워드를 사용하면, 기본적으로 가장 깊은 람다를 빠져나오게 됩니다. 이를 '비로컬 리턴'이라고 부릅니다. 그러나 때로는 바로 상위의 람다나 특정 람다에서만 리턴하고 싶을 경우가 있습니다. 이럴 때 라벨을 사용하면 특정 람다의 범위에서만 return을 할 수 있습니다.

라벨링의 사용법

라벨은 @라벨이름 형식으로 작성하며, 람다 앞에 붙여 사용합니다.

예제를 통해 자세히 알아보겠습니다.

fun main() {
    val numbers = listOf(1, 2, 3, 4, 5)
    numbers.forEach loop@{
        if (it == 3) return@loop
        println(it)
    }
}

위 예제에서 loop@는 라벨링입니다. 만약 return@loop 대신 return만 사용한다면, main 함수 자체가 종료될 것입니다. 하지만 return@loop을 사용함으로써 forEach 람다의 현재 반복만 종료하고 다음 요소로 넘어갑니다.

암시적 라벨

람다가 하나의 함수의 인자로만 전달될 때, 라벨의 이름은 그 함수의 이름이 됩니다. 따라서 암시적으로 해당 함수 이름을 라벨로 사용할 수 있습니다.

numbers.forEach {
    if (it == 3) return@forEach
    println(it)
}

위의 예제는 이전 예제와 동일한 동작을 합니다.

중첩된 람다에서 라벨링

때로는 람다 내부에 또 다른 람다가 중첩되어 있을 경우가 있습니다. 이럴 때 라벨링은 각 람다를 구별하는 데 아주 유용합니다.

numbers.map outer@{
    return@outer numbers.map inner@{
        return@inner it * 2
    }
}

위 예제에서는 outerinner라는 라벨을 각각의 map 람다에 붙였습니다. 이렇게 함으로써 각 람다를 명확하게 구분하고 참조할 수 있습니다.

결론

Kotlin의 라벨링 기능은 복잡한 람다의 흐름 제어에 유용하게 사용됩니다. 특히 중첩된 람다나 여러 람다가 함께 사용될 때, 라벨링은 코드의 가독성과 흐름 제어를 크게 향상시켜줍니다.