Binary World

리턴과 점프(Returns and Jumps) 본문

개발자의 길/Kotlin

리턴과 점프(Returns and Jumps)

모쿠 2019. 5. 29. 17:19

코틀린은 세 개의 구조적 점프 표현식이 있다:

  • return. 기본적으로, 가장 인접한 둘러싸인 함수 또는 익명 함수로부터 반환된다.
  • break. 가장 인접한 둘러싸인 반복을 종료한다.
  • continue. 가장 인접한 둘러싸인 반복의 다음 단계를 진행한다.

모든 표현식은 더 큰 표현식의 일부로 사용 가능하다.

val s = person.name ?: return

 

Break와 Continue 라벨(Labels)

코틀린에서 label로 표시되는 표현들이 있다. 레이블은 식별자로 @를 사용한다. 예시: abc@, fooBar@. 표현식에 라벨을 추가하려면, 표현식의 앞에 사용한다.

loop@ for (i in 1..100) {
    // ...
}

break 또는 continue에 라벨을 붙일 수 있다.

loop@ for (i in 1..100) {
    for (j in 1..100) {
        if (...) break@loop
    }
}

라벨이 붙여진 break는 loop@가 표시된 곳으로 이동한 후에 실행된다. continue는 해당 루프의 다음 반복으로 진행된다.

 

라벨에서 리턴(Return at Labels)

코틀린에서, 함수 리터럴, 지역 함수, 객체 표현식, 함수는 중복될 수 있다. return은 외부 함수에서 반환할 수 있도록 허용한다. 가장 중요한 사용하는 경우는 람다 표현식에서 리턴하는 것이다. 

fun foo() {
    listOf(1, 2, 3, 4, 5).forEach {
        if (it == 3) return // foo()의 호출자에 직접적으로 리턴
        print(it)
    }
    println("this point is unreachable")
}

fun main() {
    foo()
}

/* 출력 결과 */
12

람다 표현식에서 리턴을 하고 싶다면, 아래와 같이 라벨을 붙인다.

fun foo() {
    listOf(1, 2, 3, 4, 5).forEach lit@{
        if (it == 3) return@lit // local return to the caller of the lambda, i.e. the forEach loop
        print(it)
    }
    print(" done with explicit label")
}

/* 출력 결과 */
1245 done with explicit label

람다 표현식 내에 함수를 라벨 이름으로 사용할 수 있다.

fun foo() {
    listOf(1, 2, 3, 4, 5).forEach {
        if (it == 3) return@forEach // local return to the caller of the lambda, i.e. the forEach loop
        print(it)
    }
    print(" done with implicit label")
}

fun main() {
    foo()
}

/* 출력 결과 */
1245 done with implicit label

다음과 같은 방법도 가능하다.

fun foo() {
    run loop@{
        listOf(1, 2, 3, 4, 5).forEach {
            if (it == 3) return@loop // 람다 표현식을 지나서 run 위치에서 리턴
            print(it)
        }
    }
    print(" done with nested loop")
}

fun main() {
    foo()
}

/* 출력 결과 */
12 done with nested loop

값을 리턴할 때, 파서(parser)는 자격이 있는 리턴에 우선권을 부여한다.

return@a 1

 "라벨 @a1을 리턴"한다는 의미

'개발자의 길 > Kotlin' 카테고리의 다른 글

클래스와 상속(Classes and Inheritance)  (0) 2019.05.31
함수(Functions)  (0) 2019.05.30
제어 흐름(Control Flow)  (0) 2019.05.28
패키지와 임포트(Packages and Imports)  (0) 2019.05.28
기본 타입(Basic Type)  (0) 2019.05.28
Comments