흐름의 중단과 반환

Anna·2024년 6월 12일
0

코틀린

목록 보기
21/28
post-thumbnail

흐름 제어문

return 함수에서 결괏값을 반환하거나 지정된 라벨로 이동
break for나 while의 조건식에 상관없이 반복문을 끝냄
continue for나 while의 반복문의 본문을 모두 수행하지 않고 조건으로 넘어감


람다식에서 return 사용하기

InlineLambdaReturn.kt

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  //10보다 크면 이 함수를 빠져 나감
        println("result : $result")  //10보다 크면 이 문장에 도달하지 못함
    }
    println("end of retFunc")
}

//결과
start of retFunc

if문에 조건 때문에 리턴이 retFunc함수 밖으로 빠져 나가기 때문에 아래 println 두코드가 모두 출력되지 않는다. 마지막 println문까지 출력하고 싶으면 아래처럼 바꾸면 된다.

람다식에서 라벨 사용

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, fun (a, b) //3번 째 인자로 함수 전달
    {
        val result = a + b
        if(result>10) return  //익명 함수 내에서만 리턴
        println("end of retFunc")
    }) //리턴이 끝나고 reFunc 함수 밖으로 빠져 나가지 않는다.   
}

익명 함수
return 키워드가 익명 함수 자체에서만 동작하므로, 호출한 함수에는 영향을 미치지 않는다, 또한 익명함수를 사용하면 return 키워드가 익명 함수 자체에서만 빠져나가고, 호출한 함수로는 빠져나가지 않는다.


break와 continue

break

fun main()
{
    labelbreak()
}
fun labelbreak()
{
    println("laberBreak")
    for(i in 1..5)
    {
        second@ for(j in 1..5)
        {
            if (j == 3) break   //j가 3일 때 if문에서 빠져 나간다. 4, 5 숫자도 실행하지 않는다.
            println(" i : $i, j : $j")
        }
        println("after for i")
    }
}

break + 라벨

fun main()
{
    laberBreak()
}

fun laberBreak()
{
    println("laberBreak")
    first@ for(i in 1..5)
    {
        second@ for (j in 1..5)
        {
            if (j == 3) @first //라벨로 인해 for문 밖으로 나간다. j가 3이될 때, 반복문이 끝난다.
            println("i : $i, j : $j")
        }
    }
    println("after for i")
}

0개의 댓글