Returns and Jumps
코틀린은 3가지 구조적 jump 표현식을 갖는다.
- return : 기본적으로 가장가깝게 둘러싸고 있는 함수 또는 익명 함수로 부터 리턴한다.
- break : 가장 가깝게 둘러싸고 있는 루프를 종료한다
- continue : 가장 가깝게 둘러싸고 있는 루프의 다음 단계를 진행시킨다.
이러한 표현식은 큰 표현식중의 일부이다.
val s = person.name ?: return
이러한 표현식의 자료형은 Nothing이다.
Break and Continue Labels
코틀린에서의 어떠한 표현식은 label과 함께 수행될수 있다. 레이블은 @기호가 붙는다. 예를 들면 abc@, fooBar@ 이런식이다. 레이블 표현식을 사용하기 위해서는 그냥 앞에다가 label만 붙이면 된다.
loop@ for (i in 1..100) { // ... }
break 또는 continue와 함께 label을 붙일수 있다.
loop@ for (i in 1..100) { for (j in 1..100) { if (...) break@loop } }
레이블이 붙은 break는 해당 레이블이 붙어 있는 루프문을 빠져나온다. 레이블이 붙은 continue는 해당 레이블이 붙어 있는 루프문부터 다음 단계의 루프를 실행하게 된다.
Return at Labels
코틀린에서 함수 리터럴과 함께 지역 함수 그리고 오브젝트 표현식, 함수들은 함수내에서(Nested) 선언되어 사용될수 있습니다. 일부 return은 outer 함수에서로부터 리턴이 가능하다. 가장 중요한 유즈케이스로는 람다표현으로부터 return 가능하다는 점이다.
fun foo() { ints.forEach { if (it == 0) return print(it) } }
return은 가장 가깝게 둘러진 함수로부터 반환한다. 람다식에서 리턴이 필요한 경우 함수와 return에 label을 붙이기만 하면된다.
fun foo() { ints.forEach lit@ { if (it == 0) return@lit print(it) } }
지금, 람다식으로부터 리턴이 되고 있다. 암시적으로 라벨을 사용하는것은 종종 편하기도 하다. 함수와 같은 이름의 라벨이 붙어야 한다.
fun foo() { ints.forEach { if (it == 0) return@forEach print(it) } }
다른방법으로는 람다식을 익명함수로 대체할수 있다. 익명함수로부터 익명함수내의 리턴표현식으로 반환할 수도 있다.
fun foo() { ints.forEach(fun(value: Int) { if (value == 0) return print(value) }) }
값이 리턴될때 parser는 적당한것을 반환한다.
return@a 1
무슨뜻이냐면 @a에 1을 반환한다는것이다.
2개의 댓글
yangji · 2020년 1월 6일 10:46 오후
감사합니다.
Charlezz · 2020년 1월 6일 11:11 오후
🙂