[Kotlin] Scope Functions - let, run, with, apply, and also 에 대하여

2020. 2. 17. 18:44Kotlin

반응형

오늘의 개념:
Kotlin Scope Functions

 

 

처음엔 정말 헷갈렸다. 그렇지만 차이를 알고 나니 정말 쉽다!

각 함수는 크게 2가지의 특징으로 나뉜다. 이것만 알면 끝!끝!

 

 

차이 1. Context object : this 또는 it

여기서 "Context object"란, 아래 코드를 보자.

val adam = Person("Adam").apply { // 여기서 Person 객체를 어떻게 받느냐의 의미. apply는 this 로 받음
    age = 32 // 따라서, this.age 와 동일함
    city = "London" // this.city와 동일       
}
val adam = Person("Adam").also { // also는 it 으로 받음
    it.age = 32 
    it.city = "London"        
}

 

차이 2. Return value : object 또는 lamda result

 

object itself의 경우,

val numberList = mutableListOf<Double>()

numberList.apply {
        add(2.71)
        add(3.14)
        add(1.0)
    }
    .also { println("Before sorting : $it") } // also는 object 자체를 반환하며, it을 사용
    .sorted()
    .apply { println("After sorting : $this") } // apply는 object 자체를 반환하며, this를 사용
    
    
 // 결과값은 아래와 같음
 // Before sorting : [2.71, 3.14, 1.0]
 // After sorting : [1.0, 2.71, 3.14]

 

lamda result의 경우,

val list = mutableListOf("one", "two", "three")
val listSize = numbers.run { // run은 lamda result를 반환
    add("four")
    add("five")
    it.size // 이게 lamda result가 됨.
}
println("List size : $listSize") // 결과 => List size : 5

 

 

 

 

각 Scope function 별 차이 정리

  let run with apply also
Context object it this this this it
Return value lamda result lamda result lamda result object itselt object itselt

 

Scope fuctions 차이 정리 (출처 : Kotlin 공식 문서)

 

 

 

 

사용 예시

let

- non-null 값의 코드 블록을 실행할 때

val str: String? = "Hello"   
//processNonNullString(str)       // 컴파일 에러: str은 null이 될 수도 있으므로

// 아래와 같이 let으로 non-null값만 블럭에서 처리할 수 있다!
val length = str?.let { // let은 it으로 받음
    processNonNullString(it)      // OK: 'it'은 '?.let { }' 블럭 내에서 non-null !!
    it.length
}

 

run

- 객체 초기화 (아래 apply 예시 참고)

- 결괏값 계산 후 return 할 때

val service = MultiportService("https://example.kotlinlang.org", 80)

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

 

with

- 객체에서 grouping function call(?).. 말보다 아래 예시가 훨씬 이해가 빠를 듯하다.

val numbers = mutableListOf("one", "two", "three")
val firstAndLast = with(numbers) {
    "The first element is ${first()}," +
    " the last element is ${last()}"
}
println(firstAndLast)

 

apply

- 객체 초기화

val adam = Person("Adam").apply {
    age = 32
    city = "London"        
}

 

also

- 부가적인 action이 필요할 때

val numbers = mutableListOf("one", "two", "three")
numbers
    .also { println("The list elements before adding new one: $it") }
    .add("four")

 

 

 

참고

https://kotlinlang.org/docs/reference/scope-functions.html

반응형