코틀린 Label 표현식

sanghoon·2020년 12월 12일
0
post-thumbnail

코틀린은 다음 세 가지의 표현식을 통해 이후 코드를 실행할 것인지 무시할 것인지 결정할 수 있습니다.

return - 가장 가까운 함수나 익명함수에서 반환을 일으킵니다.
break - 가장 가까운 루프를 빠져나옵니다.
continue - 가장 가까운 루프에서 다음단계로 건너갑니다.

label을 사용한 break과 continue

한편 코틀린의 모든 표현식은 @을 이용하여 label(라벨, 레이블)될 수 있습니다. 이는 해당 표현식에 이름을 붙여준다고 생각하면 됩니다. 따라서 break와 continue 시 label을 사용하여 가장 가까운 루프 말고 원하는 루프의 흐름을 제어할 수 있습니다.

loop@ for (i in 1..100) {
    for (j in 1..100) {
        if (...) break@loop
    }
}

위 코드에서 break@loop를 만나면 안쪽 for루프를 빠져나오는 것이 아닌 바깥에 있는 loop@ for을 빠져나오게 됩니다.(continue의 경우에도 마찬가지입니다.)

label을 사용한 return

한편 return의 경우 가장 가까운 함수 혹은 익명함수에서만 반환되기 때문에 다음과 같은 람다식에서는 값이 반환되지 않습니다.

fun foo() {
    listOf(1, 2, 3, 4, 5).forEach {
        if (it == 3) return // foo()에서 return
        print(it)
    }
    println("이 코드는 실행되지 않습니다.")
}

따라서 람다식에서 값을 반환하고자 하는 경우에는 다음 두 가지의 코드를 생각해 볼 수 있습니다.

1. 람다식에 대한 label(명시적 label과 묵시적 label)

fun foo1() {
    listOf(1, 2, 3, 4, 5).forEach lit@{
        if (it == 3) return@lit // 람다식(forEach loop)에 대한 local return
        print(it)
    }
    print("명시적 label을 사용한 코드")
}

fun foo2() {
    listOf(1, 2, 3, 4, 5).forEach {
        if (it == 3) return@forEach // 람다식(forEach loop)에 대한 local return
        print(it)
    }
    print("묵시적 label을 사용한 코드")
}

2. 람다식에 있던 내용을 익명함수로 선언

fun foo() {
    listOf(1, 2, 3, 4, 5).forEach(fun(value: Int) {
        if (value == 3) return  // 익명함수(forEach loop)에 대한 local return
        print(value)
    })
    print("익명함수를 사용한 코드")
}

이 글은 코틀린 공식문서 Returns and Jumps를 참고하여 작성되었습니다.

0개의 댓글