Scope Function

박재원·2024년 1월 5일
0

TIL

목록 보기
24/50
post-thumbnail

강의에서 Scope Function이란 내용을 공부했다. 지금까지 내 개발 방식은 기능만 되게 하는 수준이 다였지만 취업을 하게되고 여러 사람들과 일을 하게 되면 다같이 쉽게 알아볼 수 있는 코드를 짜야한다고 생각이 들어 오늘 가독성 높은 코드를 짤 수 있게 Scope Function을 자세히 알아보겠다.

Context Object: this or it

  • Scope Function 람다식 내에서 Context Object는 실제 객체명 대신, "it" 또는 "this" 키워드로 접근하게 된다.
class Person (var name: String, var age: Int)

fun main() {
    val person = Person("홍길동", 30)
    
    //this로 참조
    person.run {
          println("이름 : ${name}") //this.name과 동일
    }
    //it로 참조
    person.let {
          println("이름 : ${it.name}")
    }
}
  • run, with, apply 는 Context Object를 "this" 로 참조한다.
  • let, also 는 Context Object를 "it" 로 참조한다.
  • "it"은 전달 인자명을 지정할 수 있다.

apply, also

  • Context Object 반환

apply

val adam = Person("Adam").apply {
    age = 32
    city = "London"        
}
println(adam)
  • Person 객체는 adap에 할당되기 이전에, apply 블럭내의 값들이 채워지고나서 adam에 할당된다.
  • 객체의 생성시점에서 객체의 초기화에 많이 사용된다.

also

val numbers = mutableListOf("one", "two", "three")
numbers
    .also { println("The list elements before adding new one: $it") }
    .add("four")
  • 'it'이나 다른 명시적인 이름으로 Context Object를 참조하기 때문에, apply보다 가독성을 높일 수 있고 간편해진다.
  • apply와 also는 리턴값이 Context Object로, 빌더패턴처럼 뒤에 이어서 dot notation을 바로 사용할 수 있다.

with, let, run

  • 람다식 결과를 반환

with

webView.settings.javaScriptEnabled = true
webView.settings.domStorageEnabled = true
webView.settings.userAgentString = “mobile_app_webview”

with(webView.settings){
    javaScriptEnabled = true
    domStorageEnabled = true
    userAgentString = “mobile_app_webview”
    webview
}
  • 길다란 dot notation없이 local scope 블럭을 생성해서 코드를 간략하게 쓸 수 있다.

let

val len = text?.let {
    println("get length of $it")
    it.length
} ?: 0
  • 보통 null 체크를 간편하게 하기위해 사용한다.
  • null 체크 후, 실행을 ket을 이용해 대체 가능하다.
  • text가 null 이면, let 블럭은 실행되지 않는다. 이는 if(text != null){} 과 동일한 효과를 갖지만, 보다 간편하다.

run

private fun performRunOperation() {
    Person().run {
        name = "Asdf"
        contactNumber = "0987654321"
        return@run "The details of the Person is: ${displayInfo()}"
    }
}
  • 범위 함수가 적용되는 객체와 다른 반환 값을 허용한다는 점에서 'let'과 유사하다.
  • 개체를 초기화하고 그 결과를 반환할 수 있다.

0개의 댓글