본문 바로가기

programming/java

Item 9. try-finally 보다는 try-with-resources를 사용하라

[Why]

  • 코드를 더 짧고 분명하게 만들 수 있기 때문 -> 가독성 향상
  • 예외 정보를 추적하기 유용하다.

[When]

  • close() 메서드를 이용해서 자원을 회수해야하는 객체를 제거할 때

[How]

try(BufferedReader br = new BufferedReader(new FileReader(path)){
    return br.readLine();
} catch(Exception e){
    e.printStackTrace();
} finally{
    br.close();
}

[GC가 있는데 왜 close()]

자바의 메모리 관리는 가비지 컬렉터에서 자동으로 처리해주기 때문에 왜 close()를 호출을 해서 자원을 명시적으로 회수를 해야하는지 궁금했다.
가비지 컬렉터는 JVM 에서 관리하는 메모리 영역을 정리해주는 역할을 한다. 하지만 네이티브 메소드나 파일 시스템의 파일, 쓰레드와 같이 JVM 단독으로 처리하지 못하는 소위 다른 시스템의 도움이 필요한 것들은 가비지 컬렉터가 정리하지 못한다. 이러한 자원을 회수하기 위해서 프로그래머가 명시적으로 close()를 통해서 자원을 회수하는 것이다.

가비지 컬렉터가 이런 자원을 회수하지 못하는 이유는 고수준 자원을 임의로 처리하면 설계의 의도를 훼손하기 때문이지 않을까?