Item9
1. Item 9: use를 사용하여 리소스를 닫아라
- 더 이상 필요하지 않을 때 close 메서드로 명시적으로 닫아야 하는 리소스가 있습니다.
- 자바 표준 라이브러이에는 이런 리소스가 많으며 AutoCloseable을 상속 받는 Closeable 인터페이스를 구현하고 있습니다.
- 이러한 리소스는 리소스에 대한 레퍼런스가 없어지면 가비지 컬렉터가 자동으로 닫아줍니다.
- 하지만 가비지 컬렉터가 리소스를 닫는 시점은 예측할 수 없으므로, 명시적으로 닫아주는 것이 좋습니다.
- 굉장히 느리며 그동안 리소스를 유지하는 비용이 발생합니다.
- 따라서 더 이상 필요하지 않다면 명시적으로 닫아주는 것이 좋습니다.
2. 전통적인 방법
- 전통적으로는 try-finally 블록을 사용하여 리소스를 닫아왔습니다.
- 하지만 이 방법은 코드가 길어지고 가독성이 떨어지며, 예외가 발생할 경우 리소스가 닫히지 않을 수 있습니다.
- 이 경우 use를 사용하면 코드를 간결하게 작성할 수 있습니다.
- use를 사용하면 Closable, AutoCloseable 인터페이스를 구현한 객체를 쉽고 안전하게 처리할 수 있습니다.
3. use 사용하기
- 코틀린에서는
use
함수를 사용하여 리소스를 안전하게 닫을 수 있습니다. use
함수는Closeable
인터페이스를 구현한 객체에 대해 확장 함수로 제공됩니다.- 블록이 정상적으로 종료되거나 예외가 발생하더라도 리소스가 자동으로 닫힙니다.
3.1 기본 사용법
fun readFirstLine(path: String): String {
BufferedReader(FileReader(path)).use { reader ->
return reader.readLine()
}
}
- 위 코드에서 BufferedReader는 블록 실행 후 자동으로 닫힙니다.
- 예외가 발생하더라도 리소스는 안전하게 닫힙니다.
3.2 useLines를 사용한 파일 라인 처리
fun countLines(path: String): Int {
return File(path).useLines { lines ->
lines.count()
}
}
- 텍스트 파일의 라인을 처리할 때는 useLines 함수를 사용하면 더 효율적입니다.
- 메모리에 파일 전체를 로드하지 않고 한 줄씩 처리하므로 대용량 파일에 적합합니다.
- 다만 파일의 줄을 한번만 사용할 수 있다는 단점이 있습니다.
- 파일의 틀적 줄을 두 번 이상 반복 처리하려면 파일을 두 번 이상 열어야 합니다.