본문 바로가기

kotlin

Kotlin의 유용한 함수 - let, apply, run, with

Kotlin의 유용한 함수

- let, apply, run, with



코들린에서 제공하는 기본적이면서도 유용한 함수 4가지 가 있다. 이 함수는 사실 잘 알려진 Kotlin extension이다


let()


let() 은 함수를 호출하는 객체를 이어지느 블록의 인자로 넘기고 블록의 결과값을 반환한다.

아래 예시는 name 이라는 String 객체의 첫번째 부분만 splite해서 출력하는 예제이다


class A {

init {
var name : String = "my , name , is"

var splite = name.split(",")

println(splite[0])
}

}


여기서 splite이라는 변수를 만들어 println 안에 splite[0]을 출력한다.




class A {
init {
var name : String = "my , name , is"

name.split(",").let {it->
println(it[0])
}
}

}



let을 사용한다면 변수를 만들지 않고 name.split(",") 의 반환된 결과가 let블록 안의 it 이라는 변수로 들어가 작업을 블록안에서 수행 할 수 있게 된다.


또한 let의 안전한 호출로 if( null != obj ) 를 대체할 수 있다.



var name : String = "my , name , is"

if(name != null){
println("not null")
}

name?.let { println("not null") }


위의 코드는 같은 결과를 제시한다.









apply()



apply 는 함수를 호출하는 객체를 apply블록의 리시버로 전달하고 객체를 반환까지 해준다.


리시버란, 바로 이어지는 블록 내에서 메서드 및 속성에 바로 접근할 수 있도록 할 객체를 의미한다.



init {
var data : TestData = TestData().apply {


name = "choi"

age = 34
    }

}

}

data class TestData(var name :String? = null, var age : Int? = null)


위의 예제는 DataClass 객체를 선언하고 apply를 사용하면 data.name 이라고 쓰지않고 apply블록 안에 name 이라고 초기화를 할 수 있다는 것이다. 








run()



run() 함수는 인자가 없는 익명 함수처럼 동작하는 형태와 객체에서 호출하는 형태 두가지의 방식이 존재한다.


객체없이 run()함수를 사용하면 인자없는 익명함수 처럼 사용하는데 이어지는 블럭내에서 처리할 작업들을 넣어줄 수 있으며 일반 한수롸 마찬가지로 값을 반환하지 않거나 특정 값을 반환할 수도 있다.


var data : TestData = TestData()

data.run {

name = "choi"

age = 34
}


run() 과 위의 apply() 의 차이점은 apply는 객체를 생성하면서 블록에 대한 수행을 하는것이고 run()은 생성된 객체를 가지고 블록에 대한 수행을 하는것 이다.


그리고 객체가 null인지 아닌지 Safe Calls를 할 수 있다.


var data : TestData = TestData()

data?.run {

name = "choi"

age = 34
}




with()


with() 함수는 run() 과 거의 동일하며 run()은 Safe Calls 를 지원하는데 with()는 지원하지 않는다.









참조

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



'kotlin' 카테고리의 다른 글

Any , 타입변환  (0) 2018.12.06
asList와 toList  (0) 2018.12.04
constructor와 init  (0) 2018.12.03
var 와 val  (0) 2018.12.03
kotlin의 코드생성 목적과 언어 설계  (0) 2018.12.03