본문 바로가기
[Android]/[Kotlin]

코틀린 심화문법 - 스코프 함수

by Hevton 2023. 1. 11.
반응형

 

 

스코프 함수에는 run, with, apply, also, let이 있다.

 

 

run

- 스코프 함수 내에서, 호출한 대상을 this로 사용할 수 있다

- 마지막 실행 코드를 반환한다

var list = mutableListOf("Scope", "Function")

// 호출 대상을, 스코프 함수 내에서 this로 사용가능
val sz = list.run {
    val listSize = this.size // this == list
    println("Length of List : ${listSize}")

    listSize // 마지막 실행 코드를 반환함
}

println("Length of List : ${sz}")


------------------
OUTPUT :
Length of List : 2
Length of List : 2

run은 말 그대로, '실행'의 의미에 가깝다. 

이미 만들어진 '인스턴스/변수' 의 값 또는 그것을 이용한 특정 계산 결과가 필요할 때 사용하면 좋겠다.

 

 

with

- run과 똑같다. 

var list = mutableListOf("Scope", "Function")

// 호출 대상을, 스코프 함수 내에서 this로 사용가능
val sz = with(list) {
    val listSize = this.size // this == list
    println("Length of List : ${listSize}")

    listSize // 마지막 실행 코드를 반환함
}

println("Length of List : ${sz}")


------------------
OUTPUT :
Length of List : 2
Length of List : 2

다른 점이 없다.

 

 

apply

- 스코프 함수 내에서, 호출한 대상을 this로 사용할 수 있다

- 호출 대상인 this 자체를 반환한다

var list = mutableListOf("Scope", "Function")

// 호출 대상을, 스코프 함수 내에서 this로 사용가능
val newlist = list.apply {
    list.add("ADD")
}
println(newlist)



------------------
OUTPUT :
[Scope, Function, ADD]

 

run이 apply와 다른 점 하나는, 반환값이 호출 대상인 this 그 자체인 것이다.

apply는 정말 '적용'의 이름값을 한다.

 

아마 익명 객체와 동시에 사용하면 더 이해가 빠를 것이다

val newlist = mutableListOf("Scope", "Function").apply {
    list.add("ADD")
}

새로 적용하여 리스트를 생성하는 느낌이다.

 

 

also

- run과 모든점이 같지만, 다른점은 this 대신 it을 사용한다는 것이다

 

let

- apply와 모든점이 같지만, 다른점은 this 대신 it을 사용한다는 것이다

 

 

 

 

마지막 실행 코드를 반환 : let, run, with

호출 대상을 반환 : apply, also

 

this 사용 : run, apply, with

it 사용 : also, let

 

 

  run with apply also let
참조 this this this it it
반환 마지막 실행 코드 마지막 실행 코드 호출 대상 호출 대상 마지막 실행 코드

 

 

개인적인 생각으론

this를 사용하며, 호출 대상인 this 자체를 반환하는 apply

it을 사용하며, 마지막 실행 코드를 반환하는 let 두 개만 알고 사용하면

별 무리가 없을 것 같다고 생각하고 있다.

 

 

반응형