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 |