람다에서 반환: 고차 함수에서 흐름 제어

유우선·2026년 2월 20일

Kotlin Study📚

목록 보기
28/32

람다 안의 return문: 람다를 둘러싼 함수에서 반환

  • 람다 안에서 return → 그 람다를 호출한 함수의 실행이 종료되고 반환됨
  • return이 선언된 람다를 호출한 함수를 반환하게 만드는 return 문을 “비로컬 return”이라고 함
data class Person(val name: String, val age: Int)

val people = listOf(Person("Alice", 29), Person("Bob", 31))

fun lookForAlice(people: List<Person>) {
		people.forEach {
				if(it.name == "Alice"){
						println("Found!")
						return // 비로컬 return
				}
		}
		println("Alice is not found")
}
  • return이 바깥 블록을 반환시키는 경우 → 인라인 함수에서만 가능

람다로부터 반환: 레이블을 사용한 return

  • 람다식에도 로컬 return문을 쓸 수 있음
  • 람다의 로컬 return → break와 비슷한 역할
    • 람다의 실행을 멈추고 람다를 호출한 함수의 실행을 이어감
  • 로컬 return과 비로컬 return을 구분하는 방법 → 레이블 사용
    fun lookForAlice(people: List<Person>) {
    		people.forEach label@{ // 람다 식 앞에 레이블 작성
    				if(it.name != "Alice") return@label // 리턴 식 뒤에 레이블 작성
    				println("Found Alice!") // return이 실행되지 않았을 경우 출력
    		}
    }
    • 람다 식 앞에 레이블을 붙이고 return 키워드 뒤에 레이블을 추가
      • 람다 레이블 → 레이블 이름 뒤에 @
      • 리턴 레이블 → 리턴 키워드 뒤에 @와 레이블 이름
    • 람다를 인자로 밭은 함수의 이름을 사용해도 됨
      people.forEach {
      		if(it.name != "Alice") return@forEach
      		println("Found Alice!")
      } 
  • 람다식에는 레이블 이름이 1개만 붙을 수 있음

this 식의 레이블

  • 수신 객체 지정 람다 → this로 수신 객체 지정 (13장 내용)
  • 수신 객체 지정 람다 앞에 레이블을 붙인 경우 this 뒤에 그 레이블을 붙여 수신객체를 지정할 수 있음
fun main() {
		println(StringBuilder().apply sb@{ // this@sb를 통해 이 람다의 수신 객체에 접근 가능
				listOf(1, 2, 3).apply {
						this@sb.append(this.toString())
				}
		})
		// [1, 2, 3]
}

익명 함수 : 기본적으로 로컬 return

  • 익명 함수 → 람다를 정의하는 또 다른 방법
    • 함수에 전달할 수 있는 코드 블록 작성 가능
  • 익명 함수에서 return을 쓰면 기본적으로 로컬 return임
    • 레이블을 지정할 필요 없음
fun findForAlice(people: List<Person>) {
		people.forEach(fun (person) {
				if(person.name == "Alice") return
				println("${person.name} is not Alice")
		})
}
  • 함수 이름 생략
  • 파라미터 타입을 컴파일러가 추론해줌
people.filter (fun (person): Boolean {
		return person.age < 30
})
  • 익명 함수에도 반환 타입을 지정할 수 있음
people.filter(fun (person) = person.age < 30)
  • 식을 본문으로 사용할 수 있음
  • 식을 본문으로 사용할 경우 반환 타입은 생략할 수 있음

return은 가장 가까운 fun 키워드를 반환시킴

0개의 댓글