Languages

kotlin 고차함수에서의 흐름제어 (return, @label)

!쪼렙조햄 2020. 5. 27. 18:23
반응형

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 키워드 가진 함수를 반환시킨다
반응형