본문으로 건너뛰기

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 함수를 사용하면 더 효율적입니다.
  • 메모리에 파일 전체를 로드하지 않고 한 줄씩 처리하므로 대용량 파일에 적합합니다.
  • 다만 파일의 줄을 한번만 사용할 수 있다는 단점이 있습니다.
    • 파일의 틀적 줄을 두 번 이상 반복 처리하려면 파일을 두 번 이상 열어야 합니다.