References: Do it! 코틀린 프로그래밍
코틀린에서의 라벨에 대해 알아봅니다.
1. 라벨
라벨이란 코드에서 특정 위치를 임의로 표기한것을 말합니다. @를 통해 사용할 수 있습니다.
@position
2. 람다식에서 라벨의 사용.
람다식을 포함한 함수에서 람다식에서의 리턴은 비지역 반환을 초래한다고 지난 글에서 다뤘습니다.
라벨을 이용하면 람다함수의 비지역 반환을 방지할 수 있습니다.
다음 예시코드는 라벨을 사용하여 람다함수의 비지역 반환을 방지하는 코드입니다.
fun lambdaFun(a: Int, b: Int, out: (Int, Int)->Unit) = out(a, b)
fun returnFun() {
println("Start of returnFun")
lambdaFun(10, 20)/** Start of lbl label. */lbl@{ a, b ->
var result = a+b
if(result >10) { return@lbl }
println("result: $result")
} /** End of lbl label. */
}
fun main() {
returnFun()
}
lbl@ 를 통해 라벨을 지정하였습니다. 라벨이 유효한 범위는 람다식 한 블럭입니다.
실행결과는 다음과 같습니다.
3. 암묵적 라벨
람다 함수에는 위 처럼 명시적으로 라벨을 지정해 줄 수도 있지만 기본적으로 암묵적 라벨이라는것이 존재합니다.
암묵적라벨은 람다함수의 이름으로 자동 설정됩니다.
예를 들어 위의 코드를 암묵적 라벨을 사용하는 코드로 바꾸면 다음과 같습니다.
fun lambdaFun(a: Int, b: Int, out: (Int, Int)->Unit) = out(a, b)
fun returnFun() {
println("Start of returnFun")
lambdaFun(10, 20){ a, b ->
var result = a+b
if(result >10) { return@lambdaFun }
println("result: $result")
}
}
fun main() {
returnFun()
}
람다함수의 이름이 자동으로 암묵적 라벨로 설정되어 별도의 라벨 지정 작업 없이 lambdaFun라벨을 사용할 수 있습니다.
4. 라벨의 응용
break/continue에 대해서도 라벨을 사용할 수 있습니다.
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")
}
위와 같이 이중 루프문을 탈출하는데 쓸 수 있으며
fun labelContinue() {
println("labelContinue")
first@for(i in 1..5){
second@for(j in 1..5){
if(j == 3){ continue@first }
println("i: $i, j: $j")
}
println("After for j")
}
println("After for i")
}
위와 같이 뒤의 작업을 스킵할 떄 사용할 수도 있습니다.
반응형
'Programming' 카테고리의 다른 글
[Kotlin] 21. 생성자 (0) | 2019.08.24 |
---|---|
[Kotlin] 20. 예외 처리 (0) | 2019.08.24 |
[Kotlin] 18. 반복문 (0) | 2019.08.23 |
[Kotlin] 17. 조건문 (0) | 2019.08.23 |
[Kotlin] 16. 꼬리 재귀 함수 (0) | 2019.08.23 |