[Effective Kotlin] 아이템9. use를 사용하여 리소스를 닫아라

Jimin Lim·2023년 7월 17일
0

Effective Kotlin

목록 보기
9/39
post-thumbnail

아이템 9

use를 사용하여 리소스를 닫아라

✅ close의 필요성

더 이상 필요하지 않을 때, close 메서드를 사용해 명시적으로 닫아야 하는 리소스가 있다.

  • Input/OutputStream
  • java.sql.Connection
  • java.io.Reader(FileReader, BufferedReader, CSSParser)
  • java.new.socket, java.util.Scanner

예를 들어 위와 같은 리소스가 있는데, 이들은 AutoCloseable을 상속받는 Closeable 인터페이스를 구현하고 있다.

리소스에 대한 레퍼런스가 없어질 때 GC가 처리하지만 비싼 비용이 든다. 따라서 명시적으로 close 메서드를 호출해 닫아주는 것이 좋다.

✅ try-finally 단점

전통적으로 try-finally 블록을 사용해 처리하였는데, 이는 다음과 같은 단점이 존재한다.

//try-finally의 예시
fun countCharactersInFile(path: String): Int {
    val reader = BufferedReader(FileReader(path))
    try {
        return reader.lineSequence().sumBy { it.length }
    }  finally { //마지막에 실행 
        reader.close()
    }
}
  • 리소스 닫을 때 예외가 발생할 수 있는데, 이는 처리하지 않음
  • try과 finally 블록 내부에서 오류가 발생하면 둘 중 하나만 전파됨 (둘 다 전파되는 것이 좋음)

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로 한 줄씩 처리할 수 있다.

reference

https://shinjekim.github.io/kotlin/2019/11/01/Kotlin-%EC%9E%90%EB%B0%94%EC%9D%98-try-with-resource-%EA%B5%AC%EB%AC%B8%EA%B3%BC-%EC%BD%94%ED%8B%80%EB%A6%B0%EC%9D%98-use-%ED%95%A8%EC%88%98/

profile
💻 ☕️ 🏝 🍑 🍹 🏊‍♀️

1개의 댓글

comment-user-thumbnail
2023년 7월 18일

정말 좋은 글 감사합니다!

답글 달기