Coding Log

011. Return과 Jump

2018.01.08 21:05 - NamhoonKim NE_Leader


Kotlin

본 카테고리는 2017년 Android 공식 언어로 채택된 Kotlin에 관하여 다룬다.

Kotlin을 이용해 개발하는 Android는 추후 따로 다루기로 하고 언어 자체에만 집중한다.

참고 kotlin 공식 사이트

Return과 Jump

Kotlin은 크게 3가지의 구조적 jump 표현식을 가지고 있다.

  • return : 기본적으로 가장 빨리 닫히는 함수(함수 블록에 속하는 경우) 또는 익명 함수에서 반환
  • break : 가장 가까운 루프를 종료
  • continue : 가장 가까운 루프의 다음 단계로 진행

위의 모든 표현식이 보다 큰 표현식의 일부로 쓰일 수도 있다.

아래 코드를 보자.

val s = person.name ?: return

이러한 타입을 Nothing type 이라고 한다.

Nothing type같은 경우엔 추후 Exception 파트에서 다루도록 하겠다.

Break와 Continue Label

Kotlin의 모든 표현식은 Label로 표시될 수 있다.

Label은 @기호 뒤에 구분자를 가지며, 특정 표현식에 Label을 붙이려면 식 앞에 Label을 작성한다.

참고 예를 들어 abc@fooBar@는 유요한 Label이다.

아래 코드를 보자.

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

이제 label을 통해서 break와 continue를 한정시킬 수 있다.

아래 코드를 보자.

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

label로 한정시킨 break는 해당 label이 붙은 for 루프 이후로 점프시킨다.

continue는 for문의 루프의 다음 루틴을 처리한다.

Label에 반환하기

Kotlin은 함수 리터럴, 지역 함수, 객체 표현식등을 함수를 중첩할 수 있도록 지원한다.

label로 한정시킨 return을 통해 외부의 함수에서 반환하도록 처리할 수도 있다.

가장 중요한 사용법은 람다식에서 돌아오는 것이다.

람다식에 label을 붙여서 return시키는 것을 꼭 기억해야 한다.

fun foo() {
    ints.forEach {
        if (it == 0) return  
        // nonlocal return from inside lambda
        // directly to the caller of foo()
        print(it)
    }
}

return은 가장 가까이 있는 함수 즉, 자신이 포함된 함수에서 동작한다.

따라서 위의 코드에서는 foo 함수에서 반환될 것이다.

참고 non-local에서의 return은 인라인 함수로 전달된 람다식에서만 동작한다.

만약 람다식에서 return하려면 아래와 같이 label을 붙여서 반환시킨다.

fun foo() {
    ints.forEach lit@{
        if (it == 0) return@lit
        print(it)
    }
}

위와 같이 작성하면 return은 람다식에서 동작한다.

이렇게 람다를 전달받은 함수와 동일한 이름을 가진 임의의 label을 사용하는 것이 종종 편리한 경우도 있다.

또 다른 방법으로 람다식을 익명의 함수로 대체하는 방법도 가능하다.

익명 함수를 이용하면 익명 함수 자체에서 return을 동작시킬 수 있다.

fun foo() {
    ints.forEach(fun(value: Int) {
        if (value == 0) return  // local return to the caller of the anonymous fun, i.e. the forEach loop
        print(value)
    })
}

참고 익명 함수는 추후 포스팅 하도록 하겠다.

만약 특정 값을 반환하는 경우, parser는 정규화된 값을 반환한다.

아래 코드를 보자.

return@a 1 

위의 return의 의미는 @a 1을 값으로 반환하는 것이 아닌 @a라는 label에 값 1을 반환한다이다.

DISQUS 로드 중…
댓글 로드 중…

트랙백을 확인할 수 있습니다

URL을 배껴둬서 트랙백을 보낼 수 있습니다