들어가기 전에
프로그램의 흐름은 언제든 중단되거나 특정 조건식으로 돌아가는등 다양한 상황에 맞춰 조정해 주어야 할 필요가 있습니다. 이때 return, break, continue문을 사용하게 되는데 하나씩 자세히 살펴보겠습니다.
핵심 키워드
- return
- break
- 라벨 표기 (label@)
학습하기
들어가기 전에
프로그램의 흐름은 언제든 중단되거나 특정 조건식으로 돌아가는등 다양한 상황에 맞춰 조정해 주어야 할 필요가 있습니다. 이때 return, break, continue문을 사용하게 되는데 하나씩 자세히 살펴보겠습니다.
핵심 키워드
학습하기
return으로 값 반환하기
보통 return문은 함수 등에서 값을 반환하는데 사용합니다. 하지만 코드의 흐름을 중단하고 함수등을 빠져 나가기 위해서도 return문을 사용할 수 있습니다.
인라인(inline)으로 선언되지 않은 람다식 함수에서 return을 사용할 때는 그냥 사용할 수 없습니다. return@label과 같이 라벨(label) 표기와 함께 사용해야 합니다. 라벨이란 코드에서 특정한 위치를 임의로 표시한 것으로, @ 기호를 뒤에 이름을 붙여서 사용합니다.
람다식에서 라벨과 함께 return 사용하기
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") // ④ 이 부분이 실행됨
}
만일 라벨과 함께 특정 값을 반환하려면 다음과 같이 표현할 수 있습니다.
return@a 1
라벨 @a에 해당하는 블록에서 값 1을 반환하게 됩니다.
참고자료
http://www.yes24.com
생각해보세요.
우리가 사용하는 return문은 일반 함수에서 값을 반환하기도 하지만 프로그램 흐름을 제어하기 위해서도 사용한다는 것을 알았습니다. 특히 람다식 구현 내부에서 return을 사용하면 비지역 반환이 일어날 수 있기 때문에 라벨이름@ 표기를 사용해 제어할 수 있었습니다. return의 다양한 응용 방법을 생각해 봅시다.
comment
미리 등록된 문자열 배열에 있는 내용과 입력받은 문자열이 일치하는 지 검사하는 프로그램에서 모든 문자역과 비교하는 것이 아니라 일치하는 문자열을 찾았으면 탈출하는 사용자정의 함수에 return을 사용할 수 있을 것 같다.