//1. Unit을 명식적으로 반환
fun hello(name: String) : Unit {
println(name)
return Unit
}
//2. Unit 이름을 생략한 반환
fun hello(name: String): Unit {
println(name)
return
}
//3. return문 자체를 생략
fun hello(name: String) {
println(name)
}
fun main(){
retFunc()
}
inline fun inlineLambda(a: Int, b: Int, out: (Int, Int) -> Unit) {
out(a, b)
}
fun retFunc() {
println("start of retFunc")
inlineLambda(13, 3) { a, b ->
val result = a + b
if(result > 10) return // 비지역 반환
println("result: $result")
}
println("end of retFunc")
}
람다식 함수명 라벨이름@{
...
return@라벨이름
}
fun main(){
retFunc()
}
fun inlineLambda(a: Int, b: Int, out: (Int, Int) -> Unit) { // inline이 제거됨
out(a, b)
}
fun retFunc() {
println("start of retFunc")
inlineLambda(13, 3) lit@{ a, b -> // ① 람다식 블록의 시작 부분에 라벨을 지정함
val result = a + b
if(result > 10) return@lit
// ② 라벨을 사용한 블록의 끝부분으로 반환
println("result: $result")
} // ③ 이 부분으로 빠져나간다
println("end of retFunc") // ④ 이 부분이 실행됨
}
fun retFunc() {
println("start of retFunc")
inlineLambda(13, 3) { a, b -> //직접 라벨 사용 X
val result = a + b
if(result > 10) return@inlineLambda //암묵적 라벨
println("result: $result")
}
println("end of retFunc")
}
fun retFunc() {
println("start of retFunc")
inlineLambda(13, 3, fun (a,b) {
val result = a + b
if(result > 10) return
println("result: $result")
}) // inlineLambda() 함수의 끝
println("end of retFunc")
}
val getMessage = lambda@{
num: Int ->
if(num !in 1..100) {
return@lambda "Error" //라벨을 통한 반환
}
"Success"
}
val getMessage = fun(num: Int): String{
if(num !in 1..100){
return "Error"
}
return "Success"
}
val result = getMessage(99)
fun main(){
for(i in 1..5){
if (i==3) break
print(i)
}
println() //개행문자
println("outside")
}
출력결과
12
outside
➕ break를 continue로 바꾸면?
1245
outside
fun labelBreak() {
println("labelBreak")
for(i in 1..5) {
second@ for (j in 1..5) {
if (j == 3) break
println("i:$i, j:$j")
}
println("after for j")
}
println("after for i")
}
위의 경우 중첩된 for문이 중단되어 첫번째 for문의 조건으로 이동함
fun labelBreak() {
println("labelBreak")
first@ for(i in 1..5) {
second@ for (j in 1..5) {
if (j == 3) break@first
println("i:$i, j:$j")
}
println("after for j")
}
println("after for i")
}
break@first와 같이 라벨을 사용할 때는 첫번째 for문 블록 자체를 빠져나가게 된다.