Kotlin에는 세 가지 구조적 점프 표현식이 있다.
- return 기본적으로 가장 가까운 둘러싸는 함수 또는 익명 함수에서 반환
- break는 가장 가까운 둘러싸는 루프를 종료한다.
- continue는 가장 가까운 둘러싸는 루프의 다음 단계를 진행한다.
이러한 모든 표현식은 더 큰 표현식의 일부로 사용할 수 있다.
val s = person.name ?: return
이러한 표현식의 유형은 Nothing 타입이다.
Break and continue labels
Kotlin의 모든 표현식은 레이블로 표시될 수 있다. 레이블에는 @ 기호가 오는 식별자 형식이 있다(예: abc@, fooBar@). 표현식에 레이블을 지정하려면 앞에 레이블을 추가하기만 하면 된다.
loop@ for (i in 1..100) {
// ...
}
이제 레이블을 사용하여 break 또는 continue를 한정할 수 있다.
loop@ for (i in 1..100) {
for (j in 1..100) {
if (...) break@loop
}
}
레이블로 규정된 break는 해당 레이블로 표시된 루프 바로 뒤의 실행 지점으로 점프한다.
continue는 해당 루프의 다음 반복으로 진행한다.
Return at labels
Kotlin에서는 함수 리터럴, 로컬 함수 및 오브젝트 표현식을 사용하면 함수를 중첩할 수 있다. 정규화된 return 을 사용하면 외부 함수에서 반환할 수 있다. 가장 중요한 사용 사례는 람다 식에서 반환하는 것이다.
fun foo() {
listOf(1, 2, 3, 4, 5).forEach {
if (it == 3) return // 로컬이 아닌 foo() 호출자에게 직접 반환한다.
print(it)
}
println("this point is unreachable")
}
fun main() {
foo()
}
return - expression은 가장 가까운 둘러싸는 함수인 foo에서 반환한다. 이러한 non-local 반환은 인라인 함수에 전달된 람다 식에 대해서만 지원된다. 람다 식에서 반환하려면 레이블을 지정하고 return으로 한정한다.
fun foo() {
listOf(1, 2, 3, 4, 5).forEach lit@{
if (it == 3) return@lit // local return to the caller of the lambda - the forEach loop
print(it)
}
print(" done with explicit label")
}
fun main() {
foo()
}
이제 람다 식에서만 반환된다. 종종 _암시적 레이블_을 사용하는 것이 더 편리하다. 이러한 레이블은 람다가 전달되는 함수와 이름이 같다.
fun foo() {
listOf(1, 2, 3, 4, 5).forEach {
if (it == 3) return@forEach // local return to the caller of the lambda - the forEach loop
print(it)
}
print(" done with implicit label")
}
fun main() {
foo()
}
또는 람다 식을 익명 함수로 바꿀 수 있다. 익명 함수의 return 문은 익명 함수 자체에서 반환된다.
fun foo() {
listOf(1, 2, 3, 4, 5).forEach(fun(value: Int) {
if (value == 3) return // local return to the caller of the anonymous function - the forEach loop
print(value)
})
print(" done with anonymous function")
}
fun main() {
foo()
}
이전 세 가지 예에서 local 반환을 사용하는 것은 일반 루프에서 continue를 사용하는 것과 유사하다. break에 직접적으로 상응하는 것은 없지만 다른 중첩 람다를 추가하고 non-local에서 반환하여 구현할 수 있다.
fun foo() {
run loop@{
listOf(1, 2, 3, 4, 5).forEach {
if (it == 3) return@loop // non-local return from the lambda passed to run
print(it)
}
}
print(" done with nested loop")
}
fun main() {
foo()
}
값을 반환할 때 파서는 정규화된 반환에 우선 순위를 부여한다.
return@a 1
이는 "@a 레이블에서 1을 반환"하고 "레이블이 있는 표현식 (@a 1) 을 반환"하지 않음을 의미한다.
원문
Returns and jumps | Kotlin
kotlinlang.org
'프로그래밍 > Android' 카테고리의 다른 글
[Kotlin] Exceptions (0) | 2021.09.05 |
---|---|
[Kotlin] Conditions and loops (조건문 및 반복문) (0) | 2021.09.05 |
[Kotlin] Type checks and casts(타입 확인 및 형변환) (0) | 2021.08.31 |
[Kotlin] Basic types (기본 타입) (0) | 2021.08.29 |
[Kotlin] Coding conventions (0) | 2021.08.26 |