Returns and Jumps
2018, Jun 13
- 코틀린은 3가지 jump expressions를 가지고 있다. - returns. break. continue.
Lable로 Break와 Continue 하기
- 코틀린에서는 어떤 식이던
라벨
로 표시할수 있다. - 라벨은 식별자 다음에
@
를 붙여 사용한다. :abc@
,fooBar@
- 특정 조건절앞에 라벨을 붙이기만 하면 label expressions을 사용할 수 있다.
myLabel@ for(i in 1..100) {
for(j in 1..100) {
println(j)
if(j == 3) break@myLabel
}
}
//*****
1
2
3
Lable로 Return
코틀린에서는 아래와 같이 return 식별자 하나만 사용이 가능한데, 공식문서에 의하면 Nothing Type을 넘기는거라고 한다.
val s = person.name ?: return
이를 이용해서 loop를 빠져 나가는 용도로 쓸 수 있다.
fun foo() {
listOf(1, 2, 3, 4, 5).forEach {
if (it == 3) return // non-local return directly to the caller of foo()
println(it)
}
println("this point is unreachable")
}
>>> foo()
1
2
주의할 점은 return-expression은 가장 가까운 함수를 return한다는 점이다.
위 코드의 경우 .forEach 람다식의 결과가 return되는 것이 아니라 함수 foo()의 리턴
으로 인식하고 함수를 빠져 나가게 된다.
- 람다식 내에서만 return 하고 싶다면 label을 이용해야 한다.
fun fooLabel() {
listOf(1, 2, 3, 4, 5).forEach lit@{
if (it == 3) return@lit // local return to the caller of the lambda, i.e. the forEach loop
print(it)
}
print(" done with explicit label")
}
>>> fooLabel()
1
2
4
5
done with explicit label
다음과 같이 앞단에 라벨을 선언하지 않고도 암시적인 Lable을 사용할 수도 있다.
fun foo() {
listOf(1, 2, 3, 4, 5).forEach {
if (it == 3) return@forEach // local return to the caller of the lambda, i.e. the forEach loop
println(it)
}
println(" done with implicit label")
}
>>> foo()
1
2
4
5
done with implicit label
- Label왜에 익명함수를 이용하여 위와 똑같은 결과를 도출 할 수도 있다.
fun foo() {
listOf(1, 2, 3, 4, 5).forEach(fun(value: Int) {
if (value == 3) return // local return to the caller of the anonymous fun, i.e. the forEach loop
println(value)
})
println(" done with anonymous function")
}
>>> foo()
1
2
4
5
done with anonymous function