[Kotlin] Scope Function

twaun95·2021년 12월 3일
0

Kotlin

목록 보기
1/6

Scope Function 이란?

객체 컨텍스트 내에서 코드 블록을 실행할 수 있게 하는 함수.
람다식을 이용해서 Scope Function을 호출하면 Scope( 범위 == 코드 블록 ) 안에서 Context Object( it 또는 this ) 를 통해서 객체에 접근이 가능해진다.

사용 이유

  1. 코드가 간결해진다.
  2. 객체의 반복적인 사용을 줄일 수 있다.
  3. Null 처리가 용이하다.
  4. 객체 자체를 반환해서 체인 형식으로 계속적인 호출이 가능하다.

특징

5가지 종류가 존재 ( apply, let, run, with, also )
이들 사이에는 두 가지 주요 차이점이 존재

  1. Return Value ( lambda result / context object)
  2. Context Object를 참조하는 방법 ( it / this )

return value 가 lambdadls 경우는 코드 블록 내에서만 적용 ,
context object는 object가 변경.

종류

1. apply

  • 반환 : context object
  • 코드 블럭 내 참조 : this
  • 사용 : 주로 객체를 초기화할 때 사용.
val adam = Person("Adam").apply {
    age = 32
    city = "London"        
}
println(adam)

2. let

  • 반환 : lambda result
  • 코드 블럭 내 참조 : it
  • 사용 : 연속적인 함수 결과를 확인하거나 null safe를 처리할 때 사용.
val numbers = mutableListOf("one", "two", "three", "four", "five")
numbers.map { it.length }.filter { it > 3 }.let { 
    println(it)
    // and more function calls if needed
} 


val str: String? = "Hello"   
val length = str?.let { 
    println("let() called on $it")        
    processNonNullString(it)      
    it.length
}

3. with

  • 반환 : lambda result
  • 코드 블럭 내 참조 : this
  • 사용 : 해당 Object를 여러번 사용할 때 반복을 줄이기 위해 사용.
val numbers = mutableListOf("one", "two", "three")
with(numbers) {
    println("'with' is called with argument $this")
    println("It contains $size elements")
}

4. run

  • 반환 : lambda result
  • 코드 블럭 내 참조 : this
  • 사용 : 코드 블록 내에서 값을 변경하고 확인할 때 사용.
val service = MultiportService("https://example.kotlinlang.org", 80)

val result = service.run {
    port = 8080
    query(prepareRequest() + " to port $port")
}

// let과 비교
val letResult = service.let {
    it.port = 8080
    it.query(it.prepareRequest() + " to port ${it.port}")
}

5. also

  • 반환 : lambda result
  • 코드 블럭 내 참조 : context obejct
  • 사용 : object 자체의 변경보다는 object의 argument를 보고 싶을 때 주로 사용.
val numbers = mutableListOf("one", "two", "three")
numbers
    .also { println("The list elements before adding new one: $it") }
    .add("four")

[참조] https://kotlinlang.org/docs/scope-functions.html#with

profile
App Developer

0개의 댓글