[Kotlin] 2-4. 리턴과 점프
리턴과 점프
코틀린에는 세 가지 구조의 점프 식이 있다
- return : 기본으로 가장 가깝게 둘러싼 함수나 익명 함수에서 리턴
- break : 가장 가깝게 둘러싼 루프를 끝낸다
- continue : 가장 가깝게 둘러싼 루프의 다음 단계를 진행
세 식 모두 더 큰 식의 일부로 사용할 수 있다
val s = person.name ?: return
이 세 식의 타입은 Nothing이다
break와 continue 라벨
코틀린의 모든 식에 label을 붙일 수 있다 / 라벨은 @부호 뒤에 식별자가 붙는 형식으로 abc@, fooBar@는 유효한 라벨
loop@ for (i in 1..100) {
// ...
}
이제 라벨을 사용해서 break나 continue를 한정할 수 있다
loop@ for (i in 1..1000) {
for (j in 1..100) {
if (...) break@loop
}
}
라벨로 한정한 break는 해당 라벨이 붙은 루프 이후로 실행 지점을 점프 / continue는 루프의 다음 반복을 진행
라벨에 리턴하기
함수 리터럴, 로컬 함수, 오브젝트 식에서 함수를 중첩할 수 있다 / 한정한 return을 사용하면 바깥 함수로 리턴 가능
가장 중요한 용도는 람다 식에서 리턴하는 것이다
fun foo() {
ints.forEach {
in (it == 0) return // 내부 람다에서 foo()의 콜러로 바로 리턴하는 비로컬 리턴
print(it)
}
}
return 식은 가장 가깝게 둘러싼 함수(ex, foo)에서 리턴
람다 식에서 리턴하고 싶다면 람다 식에 라벨을 붙여 return 한정
fun foo() {
ints.forEach lit@ {
if(it == 0) return@lit
print(it)
}
}
위 코드를 람다 식으로 리턴 / 라벨은 람다를 전달한 함수와 같은 이름을 갖는다
fun foo() {
ints.forEach {
if(it == 0) return@forEach
print(it)
}
}
람다 식 대신 익명 함수를 사용해도 됨 / 익명 함수에서 return 문장은 익명 함수 자체에서 리턴
fun foo() {
ints.forEach(fun(value: Int) {
if (value == 0) return // 익명 함수 호출에 대한 로컬 리턴 ex) forEach 루프로 리턴
print(value)
})
}
값을 리턴할 때 파서는 한정한 리턴에 우선순위를 준다
return@a 1
이 코드는 “라벨 @a에 1을 리턴”하는 것을 의미 / “라벨을 붙인 식 (@a 1)을 리턴”