아이템 9 - use를 사용하여 리소스를 닫아라

ds_chanin

·

2022. 3. 5. 01:30


use 메서드를 사용하면 Closeable/ AutoCloseable 를 구현한 객체를 쉽고 안전하게 처리할 수 있다.

더 이상 필요하지 않을때, close 메서드를 사용해서 명시적으로 닫아야하는 Resource들이 있다. 보통 이러한 Resource는 AutoCloseable 을 상속받는 Closeable 을 구현하고 있다.

이러한 리소스는 최종적으로 리소스에 대한 레퍼런스가 없어질 때, GC가 알아서 처리하지만 굉장히 느린 작업이고 비용이 비싸다. 그러므로 명시적으로 close 메서드를 호출해주는것이 좋은데, 자바를 사용할 때 try-with-resources를 사용했던 것 처럼 코틀린에서 use를 사용하도록 하라.

예제

use 는 아래와 같이 Closeable 를 구현한 객체에 사용할 수 있다.

fun countCharactersInFile(path: String): Int {
    val reader = BufferedReader(FileReader(path))
    reader.use {
        return reader.lineSequence().sumBy { it.length }
    }
}

파일을 한 줄씩 처리할 때는 useLines 메서드를 사용하라.

다만 파일의 줄을 한번만 사용할 수 있기 때문에 특정 줄을 2번 이상 활용하려면 파일을 두번 열어야 한다.

fun countCharactersInFile(path: String): Int {
    File(path).useLines { lines -> 
        return lines.sumBy { it.length }
    }
}