Languages

kotlin의 수신객체 지정 람다 (with, apply)

!쪼렙조햄 2020. 4. 26. 22:01
반응형

수신 객체 지정 람다 : with 와 apply

  • kotlin 표준 라이브러리 with, apply

  • kotlin에만 있는 기능

    • 수신 객체를 명시하지 않고 람다의 본문 안에서 다른 객체의 메소드를 호출할 수 있게 하는 것

      • 이 람다를 수신객체 지정 람다 (lambda with receiver) 라고 부른다

🧵 with 함수

  • 코틀린은 with 함수를 언어 구성요소가 아닌 라이브러리 함수를 통해 제공함 ?
fun alphabet(): String {
  val stringBuilder = StringBuilder()
  return with(stringBuilder){
    for (letter in 'A'...'Z'){
      this.append(letter)
    }
    append("\nNow I know the alphabet!")
    this.toString()
  }
}
  • with
    • parameter가 2개인 함수
    • 위 식에서 첫 parameter은 stringBuilder, 두번째는 람다함수
    • with(stringBuilder, {}) 이렇게 쓴것과 같은데 람다는 뒤로 뺄 수 있다
  • this.append
    • this를 사용해서 수신객체에 접근
    • this나 . 사용하지 않고 property, method 이름만 사용해도 수신객체의 멤버에 접근할 수 있다
fun alphabet() = with(StringBuilder()){
  ~~
}
  • 식을 본문으로 하는 함수로 표현하면 더 간단해 진다
  • 메소드 이름 충돌
    • 위 함수를 OuterClass 의 메소드로 구현했다고 하자
    • OuterClass에도 .toString() 함수가 있는 경우

🧶 apply 함수

  • apply는 항상 자신에게 전달된 객체 (수신객체)를 반환한다
fun alphabet() = StringBuilder().apply{
  for (letter in 'A'..'Z'){
    append(letter)
  }
  append("\nNow I know the Alphabet!")
}.toString()
  • 위 예제에서 apply를 실행한 결과는 StringBuilder 객체
  • 객체의 인스턴스를 만들면서 즉시 property 일부를 초기화 할때 유용
  • 수신 객체 지정 람다 함수의 예 : with, apply
    • buildString 함수와 같은 구체적인 람다함수도 있다
      • 수신 객체는 항상 String builder
반응형