use를 사용하여 리소스를 닫아라
더 이상 필요하지 않을 때, close 메서드를 사용해 명시적으로 닫아야 하는 리소스가 있다.
예를 들어 위와 같은 리소스가 있는데, 이들은 AutoCloseable을 상속받는 Closeable 인터페이스를 구현하고 있다.
리소스에 대한 레퍼런스가 없어질 때 GC가 처리하지만 비싼 비용이 든다. 따라서 명시적으로 close 메서드를 호출해 닫아주는 것이 좋다.
전통적으로 try-finally
블록을 사용해 처리하였는데, 이는 다음과 같은 단점이 존재한다.
//try-finally의 예시
fun countCharactersInFile(path: String): Int {
val reader = BufferedReader(FileReader(path))
try {
return reader.lineSequence().sumBy { it.length }
} finally { //마지막에 실행
reader.close()
}
}
use 함수에 close 로직이 포함되어있으므로, 이를 사용하는 것이 좋다.
//use의 예시
fun countCharactersInFile(path: String): Int {
val reader = BufferedReader(FileReader(path))
reader.use { //use 사용!
return reader.lineSequence().sumBy { it.length }
}
}
Closeable을 구현한 객체에 위와 같이 작성할 수 있다.
fun countCharactersInFile(path: String): Int =
File(path).useLines { lines ->
lines.sumBy { it.length }
}
또한 코틀린에서 제공하는 useLines
로 한 줄씩 처리할 수 있다.
정말 좋은 글 감사합니다!