본문 바로가기
Kotlin

유용한 함수 let, apply, run, with

by 루에 2019. 5. 21.
반응형

let : 호출하는 객체를 이어지는 블록의 인자로 넘기고 블록의 실행 결과를 반환(인자가 한 개 일 경우 it으로 대체 가능)

class A {
	fun get() {
    	println("get A")
    }
}

A?.let {
	it.get()	// "get A"
}

 

apply : 호출하는 객체를 이어지는 블록의 리시버로 전달하고 객체 자체를 반환

class A {
	var a : Int
    var b : Int
    var c : Int
    
	fun setA(n : Int) {
    	a = n
    }
	fun setB(n : Int) {
    	b = n
    }
	fun setC(n : Int) {
    	c = n
    }
}

val result = A.apply {
                setA(1)
                setB(2)
                setC(3)
            }
            
// 아래처럼 쓰는 것을 위 apply로 간단하게 대체
val result2 = A
result2.setA(1)
result2.setB(2)
result2.setC(3)

 

run : 호출하는 객체를 이어지는 블록의 리시버로 전달하고 블록의 실행 결과값을 반환. apply와 비슷하지만 안전 호출이 가능하다는 점, 객체가 아니라 결과값을 반환한다는 점, 이미 생성된 객체에 사용한다는 점이 다르다.

class A {
	var a : Int
    var b : Int
    var c : Int
    
	fun setA(n : Int) {
    	a = n
    }
	fun setB(n : Int) {
    	b = n
    }
	fun setC(n : Int) {
    	c = n
    }
}

A?.run {
  setA(1)
  setB(2)
  setC(3)
}

 

with : 인자로 받는 객체를 이어지는 블록의 리시버로 전달하고 블록의 실행 결과값을 반환. run과 아주 유사하며 인자의 위치와 안전 호출 가능 여부가 차이난다.

class A {
	var a : Int
    var b : Int
    var c : Int
    
	fun setA(n : Int) {
    	a = n
    }
	fun setB(n : Int) {
    	b = n
    }
	fun setC(n : Int) {
    	c = n
    }
}

with(A) {
  setA(1)
  setB(2)
  setC(3)
}

// A?.run{}이 아래 구문과 동일하게 작동한다. 결국 run은 let + with라고 보면 무방하다
A?.let {
	with(it){
    	setA(1)
        setB(2)
    }
}

 

더 자세한 내용은 아래 사이트 참조

https://www.androidhuman.com/lecture/kotlin/2016/07/06/kotlin_let_apply_run_with/

반응형

댓글