개발자의 길/Kotlin
리턴과 점프(Returns and Jumps)
모쿠
2019. 5. 29. 17:19
코틀린은 세 개의 구조적 점프 표현식이 있다:
- return. 기본적으로, 가장 인접한 둘러싸인 함수 또는 익명 함수로부터 반환된다.
- break. 가장 인접한 둘러싸인 반복을 종료한다.
- continue. 가장 인접한 둘러싸인 반복의 다음 단계를 진행한다.
모든 표현식은 더 큰 표현식의 일부로 사용 가능하다.
val s = person.name ?: return
Break와 Continue 라벨(Labels)
코틀린에서 label로 표시되는 표현들이 있다. 레이블은 식별자로 @를 사용한다. 예시: 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는 loop@가 표시된 곳으로 이동한 후에 실행된다. continue는 해당 루프의 다음 반복으로 진행된다.
라벨에서 리턴(Return at Labels)
코틀린에서, 함수 리터럴, 지역 함수, 객체 표현식, 함수는 중복될 수 있다. 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()
}
/* 출력 결과 */
12
람다 표현식에서 리턴을 하고 싶다면, 아래와 같이 라벨을 붙인다.
fun foo() {
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")
}
/* 출력 결과 */
1245 done with explicit label
람다 표현식 내에 함수를 라벨 이름으로 사용할 수 있다.
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
print(it)
}
print(" done with implicit label")
}
fun main() {
foo()
}
/* 출력 결과 */
1245 done with implicit label
다음과 같은 방법도 가능하다.
fun foo() {
run loop@{
listOf(1, 2, 3, 4, 5).forEach {
if (it == 3) return@loop // 람다 표현식을 지나서 run 위치에서 리턴
print(it)
}
}
print(" done with nested loop")
}
fun main() {
foo()
}
/* 출력 결과 */
12 done with nested loop
값을 리턴할 때, 파서(parser)는 자격이 있는 리턴에 우선권을 부여한다.
return@a 1
"라벨 @a에 1을 리턴"한다는 의미