흐름의 중단과 반환

OneTwoThree·2022년 7월 27일
0

부스트코스 코틀린

목록 보기
11/26
post-thumbnail

[부스트코스]흐름의 중단과 반환

예외가 발생해도 반드시 실행해야 하는 문장은 finally 블록을 이용한다

return

  • 함수에서 return을 이용해 반환하면 return 뒷부분은 실행하지 않는다.

  • Unit을 명시적으로 반환할 수 있다.
    (엄밀히 따지면 Unit이라는 특수한 자료형을 반환하는 것임)

  • return 뒤에 Unit을 생략할 수 있다. 또한 반환형 Unit과 return 값 자체를 생략할 수 있다.

람다식에서 return을 사용할 때 주의해야 한다.

inline 람다식에서 return을 사용하면 비지역 반환이 발생한다.
retFunc에서 inlineLambda를 호출하는데 이 때 인자로 전달하는 람다식에 return문이 있다.
이 return은 람다식만 빠져나갈 것 같지만 비지역 반환에 의해 retFunc 자체를 빠져나가고 retFunc의 5번 문장은 실행하지 못한다.

람다식에서 라벨 사용


해당 라벨 이름이 붙은 함수만 빠져나간다.

라벨이 붙은 람다함수만 빠져나가므로 4번 문장이 실행된다

fun main() {
    excPrF()
}

inline fun prFunc(a:Int,b:Int,prf:(Int,Int)->Unit){
    prf(a,b)
}

fun excPrF(){
    println("start")
    prFunc(1,2){x,y->
        println("prFstart")
        return
        println("prFend")
    }
    println("end")
}

start
prFstart

return문으로 비지역반환이 발생해서 람다함수 밖의 end도 출력하지 않고 excPrF를 빠져나갔다.

fun main() {
    excPrF()
}

inline fun prFunc(a:Int,b:Int,prf:(Int,Int)->Unit){
    prf(a,b)
}

fun excPrF(){
    println("start")
    prFunc(1,2)mom@{x,y->
        println("prFstart")
        return@mom
        println("prFend")
    }
    println("end")
}

start
prFstart
end

라벨을 이용해서 람다식과 return에 라벨을 붙여주자 람다식만 탈출하고 excPrF는 탈출하지 않아 end가 출력된다.

[부스트코스]흐름의 중단과 반환(2)

암묵적 라벨


라벨을 따로 지정하지 않고 람다식을 인자로 전달받는 함수의 이름을 라벨로 전달하면 해당 함수만 빠져나간다. 즉 같은 효과를 얻을 수 있다.

  • 익명함수에서 return
    람다식은 익명함수의 일종이다. 람다식에서 return을 사용하면 비지역반환이 발생한다. 하지만 람다식이 아닌 익명함수에서 return을 사용하면 비지역반환이 발생하지 않는다. 이것이 일반 익명함수가 람다식에 비해 가지는 장점이다.


람다식에서는 라벨을 이용해서 return에서 람다식만 탈출하도록 한다.
람다식에서는 return을 사용하지 않아도 마지막 문장이 getMessage 변수에 할당된다.


익명함수에서는 라벨 필요없이 함수를 작성하면 된다. 비지역반환이 발생하지 않기 때문이다.

break, continue

break는 반복을 탈출하고 continue는 아래 내용을 실행하지 않고 다음 반복으로 넘어간다.

  • 라벨과 break, continue를 같이 사용할 수 있다.
    라벨을 함수나 for문 앞에 붙일 때는 라벨명@함수명 과 같이 작성하고
    return, break같은 키워드 뒤에 붙일 때는 키워드@라벨명으로 작성한다.
fun main() {
    first@for (i in 1..3){
         second@for (j in 1..3){
             if (i==2) break@first
             println("i = $i j = $j")
         }
    }
}

i = 1 j = 1
i = 1 j = 2
i = 1 j = 3

외부 for문에는 first 라벨을 내부 for문에는 second 라벨을 달았다.
원래 내부 for문에서 break하면 내부 for문만 탈출해야 하지만 break에 first라벨을 달아서 외부 for문을 탈출한다.

0개의 댓글