728x90
반응형
기존의 코드에서 resource 입축력을 수행한 이후
개발자는 메모리 누수를 방지하기 위해 반드시 resource를 더이상 사용하지 않는다는 의미에서
close 메서드를 호출해주어야 했습니다.
try {
val file = File("file.txt")
var read = file.bufferedReader()
println(read.readText())
} catch (exception: Exception) {
} finally {
read.close() // 닫아주는 코드 필요!
}
하지만 개발자가 이러한 경우에 매번 close를 해주는 건 불필요한 공통 코드를 늘릴 수 있습니다.
🌹 Kotlin에서는 이를 위해 use 확장함수를 제공해줍니다.👍🎁
use 확장함수를 간단하게 봐보도록 하겠습니다.
public inline fun <T: Closeable?, R> T.use(block: (T)->R): R {
var exception: Throwable? = null
try {
// resoure 입출력 수행
return block(this)
} catch (e: Throwable) {
// 에러 발생 시
exception = e
throw e
} finally {
when {
// 수신객체가 null인 경우, 아무 동작도 하지 않음
this == null -> {}
// 에러가 발생하지 않은 경우, 바로 close
exception == null -> close()
else -> {
try {
close()
} catch (closeException: Throwable) {}
}
}
}
}
위의 코드에서 볼 수 있듯이 use 확장함수는 일단 주어진 resource 입출력 동작을 수행하고 나서 동작이 완료되었을 때,
close()까지 해주는 코드가 내장되어 있어, 개발자가 별도로 close() 해줄 필요가 없습니다.
그럼 처음 예로 들었던 코드를 수정해보겠습니다.
val file = File("file.txt")
file.bufferedReader().use {
println(read.readText())
}
반응형
'Kotlin' 카테고리의 다른 글
data object! (1) | 2024.11.09 |
---|---|
[Coroutine] 코루틴 내부동작 분석해보기! (0) | 2023.03.27 |
[Kotlin 공식문서 읽어보기] 코틀린과 채널 기본기 다지기! (0) | 2023.02.07 |
[Flow] 연산자 내부코드를 열어보자! (0) | 2023.01.28 |
[Equality] == vs. === (0) | 2023.01.28 |