반응형
8.3 고차 함수 안에서 흐름 제어
- 루프 안에 return 이 있는 코드를 람다로 바꿀때 일어나는 일
8.3.1 람다 안의 return 문
val people = listOf(Person("Alice", 29), Person("Bob", 31))
fun lookForAlice(people : List<Person>){
people.forEach{
if(person.name == "Alice"){
println("Found!")
return
}
}
println("Alice is not found")
}
- 이름이 Alice인 경우에 lookForAlice 함수는 return 된다
- 위 예제처럼 람다 안에서 return 사용하면 람다로부터만 반환 되는게 아니라 그 람다를 호출하는 함수가 실행을 끝내고 반환된다
- 이런것을 non-local return 이라고 한다
- return이 바깥쪽 함수를 반환시킬 수 있는 때는 람다를 인자로 받는 함수가 inline 함수인 경우 뿐이다
- 위의 forEach도 inline 함수이므로 람다 본문과 함께 inline 된다
- 그래서 return 식이 바깥쪽 함수(lookForAlice)를 반환시키도록 컴파일 할 수 있다
8.3.2 람다로부터 반환 : 레이블을 사용한 return
- 람다식에서도 local return을 사용할 수 있다
- local return은 람다의 실행을 끝나고 람다를 호출했던 코드의 실행을 계속 이어간다
- local return, non-local return 구별을 위해 label 사용
fun lookForAlice(people : List<Person){
people.forEach label@{
if(it.name == "Alice") return@label
}
println("Alice might be somewhere")
}
- @label 표시로 실행을 끝내고싶은 람다식 앞에 라벨을 붙여준다
- 위예제에서는 프린트까지 꼭 나오게 됨
fun lookForAlice(people:List<Person>){
people.forEach{
if(it.name == "Alice") return@forEach
}
}
- 위와 같이 인라인 함수의 이름을 레이블로 사용해도 된다
8.3.3 무명 함수 : 기본적으로 로컬 return
- 무명함수 : 코드 블록을 함수에 넘길 때 사용할 수 있는 다른 방법
fun lookForAlice(people : List<Person>){
people.forEach(fun (person){
if(person.name == "Alice") return
println("${person.name} is not Alice")
})
}
- 무명함수는 함수이름, 파라미터 타입은 생략할수있고, fun 키워드가 붙어있다
- 무명 함수에서 return은 무명함수 자체를 반환시킨다
- return은 가장 안쪽 fun 키워드 가진 함수를 반환시킨다
반응형
'Languages' 카테고리의 다른 글
kotlin의 제네릭 타입 파라미터 (generic, property) (0) | 2020.06.03 |
---|---|
kotlin의 inline 함수 (고차함수, synchronized) (0) | 2020.05.26 |
kotlin의 고차함수 (lambda) (0) | 2020.05.26 |
kotlin의 구조분해 선언과 component 함수 (0) | 2020.05.18 |
kotlin 의 비교 연산자 오버로딩 (equals, compareTo) (0) | 2020.05.18 |