관리 메뉴

막내의 막무가내 프로그래밍 & 일상

[안드로이드] 코틀린 범위 지정 함수, 고차 함수 (let, apply, with, run) 본문

안드로이드/코틀린 & 아키텍처 & Recent

[안드로이드] 코틀린 범위 지정 함수, 고차 함수 (let, apply, with, run)

막무가내막내 2019. 11. 20. 00:55
728x90

 

[2021-04-13 업데이트]

 

출처 :커니의 코틀린(강추!)

 

밑 링크에 예제를 좀 더 자세히 포스팅 했습니다. 참고해주세요 :)

https://youngest-programming.tistory.com/578

 

[안드로이드] 코틀린 범위지정함수(Scoping Functions) - let, run, with, apply, also - 코드에러나서 고치는

[코틀린의 특징] 코틀린은 인틸레지에서 만든 언어로 JVM에서 동작하고 자바와 100% 호환된다는 특징을 갖고 있습니다. 이밖에도 Null Safety, 함수형프로그래밍, 확장함수, 코드의 간결함 등 다양한

youngest-programming.tistory.com

 

let() 

fun <T,R> T.let(block: (T) -> R) : R
이 함수를 호출하는 객체를 이어지는 함수형 인자 block의 인자로 전달하며, block 함수의 결과를 반환한다.

ex)
fun letEx(str : String?){
	if(null != str){
    	println(str)
    }
}

=> 

fun letEx(str : String?){
   str?.let{
       print(it)
   }
}

이 함수를 호출한 객체를 이어지는 함수 블록이 인자로 전달됩니다.  이 함수를 사용하면 불필요한 변수 선언을 방지할 수 있습니다. 

 

 


 

apply()

fun<T> T.apply(block: T.() -> Unit): T
이 함수를 호출하는 객체를 이어지는 함수형 인자 block의 리시버로 전달하며, 함수의 호출한 객체를 반환합니다.

ex)
val param = LinearLayout.LayoutParams(
	LinearLayout.LayoutParams.WRAP_CONTENT,
    LinearLayout.LayoutParams.WRAP_CONTENT)

param.weight = 1f
param.padding = 16


=>

val param = LinearLayout.LayoutParams(
	LinearLayout.LayoutParams.WRAP_CONTENT,
    LinearLayout.LayoutParams.WRAP_CONTENT).apply{
  	weight = 1f
    padding = 16
 }

이 함수를 호출한 객체를, 이어지는 함수 블록의 리시버로 전달합니다. 함수를 호출한 객체를 함수형 인자 블록의 리시버로 전달하므로, 이 블록 내에서는 해당 객체 내의 프로퍼티나 함수를 직접 호출 할 수 있습니다. 따라서 객체 이름을 일일이 명시하지 않아도 되므로 코드를 간략하게 만드는데 큰 도움이 됩니다.

 


with()

 

fun<T,R> with(receiver: T, block: T.() -> R):R
인자로 받은 객체 receiver를 이어지는 함수형 인자 block의 리시버로 전달하며, block 함수의 결과를 반환한다.

ex)
fun exWith(textView : TextView){
	with(textView){
    	text = "Change Text"
        gravity = Gravity.CENTER
    }
}
        

인자로 받은 객체를 이어지는 함수 블록의 리시버로 전달합니다. let(), apply() 함수와 달리 이 함수에서 사용할 객체를 매개변수를 통해 받습니다. 따라서 안전한 호출을 사용하여 인자로 전달되는 객체가 널 값이 아닌 경우 함수의 호출 자체를 막는 방법을 사용할 수 없으므로 널 값이 아닌 것으로 확인된 객체에 이 함수를 사용하는 것을 권장합니다.

val animal: Animal = Person("Lion", "5")
with(animal) {
    println(type)  //animal.type
    print;n(age)   //animal.age
}

 


run()

fun <R> run(block:() -> R): R
함수형 인자 block을 호출하고 그 결과를 반환한다.

ex)
val sum = {
	//블록 내부 선언한 값들은 외부에 노출되지 않는다. 
	val a = 3
    val b = 5
    
    //계산된 값을 반환해서 sum에 저장된다.
    a + b
}
    

인자가 없는 익명 함수처럼 사용하는 형태와 객체에서 호출하는 형태를 제공합니다.

전자의 경우 복잡한 계산을 위해 여러 임시 변수가 필요할 때 유용하게 사용할 수 있습니다. 왜냐하면 run() 함수 내부에서 선언되는 변수들은 블록 외부에 노출되지 않으므로 변수 선언 영역을 확실하게 분리가 가능합니다.

 

후자의 경우는 with()함수와 유사한 목적으로 사용할 수 있습니다. run() 함수는 안전한 호출을 사용할 수 있으므로 널 값일 수 있는 객체의 속성이나 함수에 연속적으로 접근해야 할 때 사용합니다.

 

 

 

P.S

제가 이해하기 쉬웠던 예제입니다.

https://ktko.tistory.com/entry/%EC%BD%94%ED%8B%80%EB%A6%B0-%EA%B3%A0%EC%B0%A8%ED%95%A8%EC%88%98-run-apply-let-with-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0

 

코틀린 고차함수 run, apply, let, with 사용하기

run()에 대하여 run() 함수는 두 가지 형태로 사용 된다. 람다를 실행하고 그 결과값을 얻는 목적으로 사용하거나 객체의 멤버에 접근하기 위해 사용한다. run 함수의 매개변수에 함수 타입이 선언되어 있으므로..

ktko.tistory.com

 

 

댓글과 공감은 큰 힘이 됩니다. 감사합니다. !!

 

 

728x90
Comments