티스토리 뷰

Mobile/Android

kotlin let, with, run, apply, use

out of coding 2018. 4. 11. 14:43

코틀린에서 아주 유용하게 사용 가능한 함수가 있습니다.

let, run, apply등등이죠... 제목처럼요.


이것들은 아주 편안하게 코딩을 할수 있도록 도움을 줍니다.

optional 바인딩 같은것을 쉽게 할수 있죠...

마치 swift의 guard 처럼요.


시작해봅시다요.


1. let


1
public inline fun <T, R> T.let(f: (T) -> R): R = f(this)
cs


T타입의... 즉 아무 객체에서 접근이 가능하게 만들어져 있습니다.

람다가 어렵게 느껴지겠지만, 의미를 풀어보면 

f(this)을 호출하여서 R Type으로 리턴을 합니다.


펑션을 만들어서 호출하는것이죠. 그러므로 그 펑션안에서 자신의 값을 그대로 사용을 할수 있습니다.


그럼 다음과 같이 사용이 가능합니다.


1
2
3
variable?.let {
    it.brabra
}
cs


블럭안에서의 it은 옵셔널이 아닙니다. 참으로 편리합니다. 그쵸?


제가 swift의 guard 처럼 사용 가능하다고 했는데요.

이렇게 사용하면 그 아래에서는 test는 옵셔널이 아닙니다.


1
let test = variable?.let { it } ?: return
cs


2. with


1
public inline fun <T, R> with(receiver: T, f: T.() -> R): R = receiver.f()
cs


let과는 다르게 T타입을 확장하지 않고 with에 파라메터로 넘겨줍니다. 그러면 객체를 넘길수 있겠죠?

그렇게 되었을 경우에 객체가 그대로 리턴이 되는 형태이기 때문에 블럭 안에는 객체 자체가 됩니다.


1
2
3
4
5
6
7
8
data class User(val name: String? = null)
 
// 이름이 없는 사람은 없겠죠?
val user = User()
 
with (user) {
    name = "dh"
}
cs


3. run


1
public inline fun <T, R> T.run(f: T.() -> R): R = f()
cs


위의 let과 with를 합쳐놨습니다. 음?


1
2
3
4
val user = User().run {
    name = "dh"
    this
}
cs


무언가 기괴하기는 하지만 this를 리턴하면서 한방에 초기화가 가능합니다. 위처럼 따로 쓸 필요가 없을것 같네요!


4. apply


1
public inline fun <T> T.apply(f: T.() -> Unit): T { f(); return this }
cs


run하고 거의 동일합니다. 그런데 뭐가 다를까요? return 형이 this입니다.

그래서 run과는 다르게 this를 리턴하지 않아도 됩니다.


1
2
3
val user = User().apply {
    name = "dh"
}
cs


5. use


1
public inline fun <T : Closeable, R> T.use(block: (T) -> R): R { /* 생략 */ }
cs


간단하게 설명하면 Closeable를 구현한 클래스에 대해서 사용이 가능합니다.

이건 어디서 사용하느냐...

만약 사용하고 close를 하여야 하는 클래스가 있다면 아주 이야기가 편해지죠. 파일을 읽고나서 close를 안해주면 답답해지니까요.


1
2
3
PrintWriter(FileOutputStream("output.txt")).use {
    it.println("hello")
}
cs


anko라는 라이브러리안에서 이런 형식으로 구현이 되어 있는것으로 아는데요.

코드에서는 많은 도움을 줍니다.


이만... 정리를 마무리하겠습니다.


즐거운 코딩되세요... 저는 구시대 개발자라 쓸때만 씁니다. 남발하지 맙시다 ㅎㅎ

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함