[Kotlin] 2-4. 리턴과 점프

리턴과 점프

코틀린에는 세 가지 구조의 점프 식이 있다

세 식 모두 더 큰 식의 일부로 사용할 수 있다

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)을 리턴”