들어가기 전에
계속 이어서 암묵적 라벨 표현방법이나 익명함수에서 반환 하는 방법과 break, continue 대해서 살펴봅니다.
핵심 키워드
- 암묵적 라벨
- 익명 함수를 사용한 반환
- break
- continue
학습하기
들어가기 전에
계속 이어서 암묵적 라벨 표현방법이나 익명함수에서 반환 하는 방법과 break, continue 대해서 살펴봅니다.
핵심 키워드
학습하기
암묵적 라벨
람다식 표현식 블록에 직접 라벨을 쓰는 것이 아닌 람다식 함수의 명칭을 그대로 라벨처럼 사용할 수 있는데 이것을 암묵적 라벨이라고 부릅니다.
...
fun retFunc() {
println("start of retFunc")
inlineLambda(13, 3) { a, b ->
val result = a + b
if(result > 10) return@inlineLambda
println("result: $result")
}
println("end of retFunc")
}
...
위의 코드처럼 람다식 함수의 이름을 직접 라벨처럼 사용할 수 있습니다. 결과는 라벨을 사용한 예제와 동일하게 inlineLambda()로 빠져나갑니다.
익명 함수를 사용한 반환
물론 람다식 함수 표현식 대신에 익명 함수를 넣을 수도 있습니다. 익명 함수는 앞서 배운 것 처럼 fun (...) {...} 형태로 이름 없이 특정 함수의 인자로 넣을 수 있습니다. 이때는 익명함수 내부에서 라벨을 사용하지 않고 단순히 return만 사용하더라도 비지역 반환이 일어나지 않습니다. 따라서 일반 함수의 반환처럼 편하게 사용할 수 있습니다.
break와 continue
break는 해당 키워드를 사용한 지점에서 for나 while, do...while문 루프를 빠져 나오게 됩니다. continue는 이후 본문을 계속 진행하지 않고 다시 반복 조건을 살펴보게 됩니다.
break와 라벨 함께 사용하기
break와 함께 라벨을 사용해서 중단되는 위치를 바꿀 수 있게 됩니다.
fun labelBreak() {
println("labelBreak")
for(i in 1..5) {
second@ for (j in 1..5) {
if (j == 3) break
println("i:$i, j:$j")
}
println("after for j")
}
println("after for i")
}
여기서 단순히 break를 사용한 경우 중첩되어 있는 두번째 for문이 중단되어 첫번째 for문의 조건으로 돌아갑니다.
fun labelBreak() {
println("labelBreak")
first@ for(i in 1..5) {
second@ for (j in 1..5) {
if (j == 3) break@first
println("i:$i, j:$j")
}
println("after for j")
}
println("after for i")
}
break@first 와 같이 라벨을 사용할 때는 이때 첫 번째 for문 first@ for 의 블록 자체를 빠져나가게 됩니다.
참고자료
http://www.yes24.com
생각해보세요.
이제 제어에 대한 return, break, continue에 대해 모두 살펴보았는데요. 마지막 예제에 있었던 break 비교 예제에 continue를 사용했을 때는 어떻게 되는지 모두 함께 생각해 봅시다. 결과를 모두 댓글을 통해 남겨 보아요.
comment
라벨이없는 break
unlabeled break statement
i:1, j:1
i:1, j:2
i:2, j:1
i:2, j:2
i:3, j:1
i:3, j:2
i:4, j:1
i:4, j:2
i:5, j:1
i:5, j:2
라벨이있는 break
a break statement with a label
i:1, j:1
i:1, j:2
라벨이없는 continue
unlabeled continue statement
i:1, j:1
i:1, j:2
i:1, j:4
i:1, j:5
i:2, j:1
i:2, j:2
i:2, j:4
i:2, j:5
i:3, j:1
i:3, j:2
i:3, j:4
i:3, j:5
i:4, j:1
i:4, j:2
i:4, j:4
i:4, j:5
i:5, j:1
i:5, j:2
i:5, j:4
i:5, j:5
라벨이있는 continue
a continue statement with a label
i:1, j:1
i:1, j:2
i:2, j:1
i:2, j:2
i:3, j:1
i:3, j:2
i:4, j:1
i:4, j:2
i:5, j:1
i:5, j:2
라벨이 없는 경우
labelBreak
i: 1, j: 1
i: 1, j: 2
i: 1, j: 4
i: 1, j: 5
after for j
i: 2, j: 1
i: 2, j: 2
i: 2, j: 4
i: 2, j: 5
after for j
i: 3, j: 1
i: 3, j: 2
i: 3, j: 4
i: 3, j: 5
after for j
i: 4, j: 1
i: 4, j: 2
i: 4, j: 4
i: 4, j: 5
after for j
i: 5, j: 1
i: 5, j: 2
i: 5, j: 4
i: 5, j: 5
after for j
after for i
라벨이 있는 경우
labelBreak
i: 1, j: 1
i: 1, j: 2
i: 2, j: 1
i: 2, j: 2
i: 3, j: 1
i: 3, j: 2
i: 4, j: 1
i: 4, j: 2
i: 5, j: 1
i: 5, j: 2
after for i
labelbreak
i: 1, j: 1
i: 1, j: 2
i: 2, j: 1
i: 2, j: 2
i: 3, j: 1
i: 3, j: 2
i: 4, j: 1
i: 4, j: 2
i: 5, j: 1
i: 5, j: 2
after for i
라벨이 없는 continue문
i: 1, j: 1
i: 1, j: 2
i: 1, j: 4
i: 1, j: 5
after for j
i: 2, j: 1
i: 2, j: 2
i: 2, j: 4
i: 2, j: 5
after for j
i: 3, j: 1
i: 3, j: 2
i: 3, j: 4
i: 3, j: 5
after for j
i: 4, j: 1
i: 4, j: 2
i: 4, j: 4
i: 4, j: 5
after for j
i: 5, j: 1
i: 5, j: 2
i: 5, j: 4
i: 5, j: 5
after for j
after for i
라벨이 있는 continue문
i: 1, j: 1
i: 1, j: 2
i: 2, j: 1
i: 2, j: 2
i: 3, j: 1
i: 3, j: 2
i: 4, j: 1
i: 4, j: 2
i: 5, j: 1
i: 5, j: 2
after for i
1. 라벨이 없는 경우
labelBreak
i: 1, j: 1
i: 1, j: 2
i: 1, j: 4
i: 1, j: 5
after for j
i: 2, j: 1
i: 2, j: 2
i: 2, j: 4
i: 2, j: 5
after for j
i: 3, j: 1
i: 3, j: 2
i: 3, j: 4
i: 3, j: 5
after for j
i: 4, j: 1
i: 4, j: 2
i: 4, j: 4
i: 4, j: 5
after for j
i: 5, j: 1
i: 5, j: 2
i: 5, j: 4
i: 5, j: 5
after for j
after for i
2. 라벨이 있는 경우
labelBreak
i: 1, j: 1
i: 1, j: 2
i: 2, j: 1
i: 2, j: 2
i: 3, j: 1
i: 3, j: 2
i: 4, j: 1
i: 4, j: 2
i: 5, j: 1
i: 5, j: 2
after for i
1. 라벨 없는 continue
labelContinue
i:1, j:1
i:1, j:2
i:1, j:4
i:1, j:5
after for j
i:2, j:1
i:2, j:2
i:2, j:4
i:2, j:5
after for j
i:3, j:1
i:3, j:2
i:3, j:4
i:3, j:5
after for j
i:4, j:1
i:4, j:2
i:4, j:4
i:4, j:5
after for j
i:5, j:1
i:5, j:2
i:5, j:4
i:5, j:5
after for j
after for i
2. 라벨 있는 continue
labelContinue
i:1, j:1
i:1, j:2
i:2, j:1
i:2, j:2
i:3, j:1
i:3, j:2
i:4, j:1
i:4, j:2
i:5, j:1
i:5, j:2
after for i
labelBreak
i:1, j:1
i:1, j:2
i:2, j:1
i:2, j:2
i:3, j:1
i:3, j:2
i:4, j:1
i:4, j:2
i:5, j:1
i:5, j:2
after for i
labelBreak
i:1 j:1
i:1 j:2
i:2 j:1
i:2 j:2
i:3 j:1
i:3 j:2
i:4 j:1
i:4 j:2
i:5 j:1
i:5 j:2
after for i
labelBreak
i:1, j:1
i:1, j:2
i:2, j:1
i:2, j:2
i:3, j:1
i:3, j:2
i:4, j:1
i:4, j:2
i:5, j:1
i:5, j:2
after for i
< NoLabelContinue >
i:1, j:1
i:1, j:2
i:1, j:4
i:1, j:5
after for j
i:2, j:1
i:2, j:2
i:2, j:4
i:2, j:5
after for j
i:3, j:1
i:3, j:2
i:3, j:4
i:3, j:5
after for j
i:4, j:1
i:4, j:2
i:4, j:4
i:4, j:5
after for j
i:5, j:1
i:5, j:2
i:5, j:4
i:5, j:5
after for j
after for i
< labelContinue >
i:1, j:1
i:1, j:2
i:2, j:1
i:2, j:2
i:3, j:1
i:3, j:2
i:4, j:1
i:4, j:2
i:5, j:1
i:5, j:2
after for i
<라벨 없는 continueabel Break
i:1, j:1
i:1, j:2
i:1, j:4
i:1, j:5
after for j
i:2, j:1
i:2, j:2
i:2, j:4
i:2, j:5
after for j
i:3, j:1
i:3, j:2
i:3, j:4
i:3, j:5
after for j
i:4, j:1
i:4, j:2
i:4, j:4
i:4, j:5
after for j
i:5, j:1
i:5, j:2
i:5, j:4
i:5, j:5
after for j
after for i
<라벨있는 continue>
label Break
i:1, j:1
i:1, j:2
i:2, j:1
i:2, j:2
i:3, j:1
i:3, j:2
i:4, j:1
i:4, j:2
i:5, j:1
i:5, j:2
after for i
라벨 없는 Continue
i:1, j:1
i:1, j:2
after for j
i:2, j:1
i:2, j:2
after for j
i:3, j:1
i:3, j:2
after for j
i:4, j:1
i:4, j:2
after for j
i:5, j:1
i:5, j:2
after for j
after for i
라벨있는 Continue
i:1, j:1
i:1, J:2
after for i
labelBreak
i: 1, j: 1
i: 1, j: 2
i: 2, j: 1
i: 2, j: 2
i: 3, j: 1
i: 3, j: 2
i: 4, j: 1
i: 4, j: 2
i: 5, j: 1
i: 5, j: 2