티스토리 뷰

Kotlin

[Kotlin] scope function

hyuuny 2022. 6. 28. 00:13


코틀린의 scope function이란, 람다를 사용해서 일시적인 영역을 만들어 코드를 더 간결하게 하거나, method chaning에 활용하는 함수를 말한다.


이번에는 코틀린의 scope function에 대해 알아보자!


1. scope function의 분류
2. 언제 어떤 scope function을 사용해야 할까?


scope function의 분류

letrun은 람다의 결과를 반환하고, alsoapply는 객체 그 자체를 반환한다.
아래 예제코드를 살펴보면서 조금 더 쉽게 이해해보자.

    val person = Person("김성현", 10)

    // 반환 : age
    val let = person.let {
        it.age
    }

    val run = person.run {
        this.age
    }

    // 반환 : person
    val also = person.also {
        it.age
    }

    val apply = person.apply {
        this.age
    }

    println("let= $let")
    println("run= $run")
    println("also= $also")
    println("apply= $apply")

결과

위 결과를 보면 예상한 것과 같이 letrun은 함수의 결과를 반환하고, alsoapply는 객체를 반환하는 것을 확인할 수 있다.


코드를 보면 letalsoit을 사용하고, runapplythis를 사용하는데,
this는 생략이 가능한 대신, 다른 이름을 붙일 수 없지만,
it은 생략이 불가능한 대신, 다른 이름을 붙일 수 있다는 차이가 있다.


let은 파라미터로 일반 함수를 받고, run은 확장함수를 받는다. 확장함수에서는 본인 자신을 this로 호출하고, 생략이 가능하기 때문에 runapply에서 this를 생략해도 문제가 없는 것이다.

    val let = person.let { p ->
        p.age
    }

    val run = person.run {
        age
    }

    val also = person.also { p ->
        p.age
    }

    val apply = person.apply {
        age
    }


언제 어떤 scope function을 사용해야 할까?

let

하나 이상의 함수를 call chain 결과로 호출할 때 사용하거나, non-null 값에 대해서만 code block을 실행시킬 때 사용

  //하나 이상의 함수를 `call chain` 결과로 호출
  val strings = listOf("APPLE", "BANANA")
  strings.map { it.length }
      .filter { it > 3 }
      .let(::println)

  // non-null 값에 대해서만 code block 실행
  // str이 null이 아니라면, 문자열 길이를 반환
  val length = str?.let {
      println(it.uppercase())
      it.length
  }

run

객체 초기화와 반환 값의 계산을 동시에 해야 할 때 사용

  // 객체를 만들어 DB에 저장하고, 바로 그 객체를 활용
  val person = Person("김성현", 10).run { memberRepository::save }

  // 그렇지만.. 자바개발자에게 조금 더 익숙한 방식..
  val person = personRepository.save(Person("김성현", 10))

apply

객체 설정 중, 객체를 수정하는 로직이 call chain 중간에 필요할 때 사용

    val person = Person("김성현", 10)
    person.apply { this.growOld() }
        .let(println(it))

also

객체를 수정하는 로직이 call chain 중간에 필요 할 때 사용

    mutableListOf("one", "two", "three")
        .also { println("$it") }
        .add("four")

정리

  • kotlinscope function은 일시적인 영역을 만들어 코드를 더 간결하게 하거나, method chaning에 활용한다.
  • scope function의 종류에는 let, run, also, apply가 있다.

'Kotlin' 카테고리의 다른 글

[Kotlin] 리액티브 프로그래밍 & 리액티브 스트림  (0) 2022.09.16
[Kotlin] 비동기-논블로킹 프로그래밍  (0) 2022.09.14
[Kotlin] 람다(lambda)  (0) 2022.06.22
[Kotlin] Collection  (0) 2022.06.19
[Kotlin] 클래스  (0) 2022.06.17
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함