[아이템 9] try-finally보다는 try-with-resources를 사용하라

ajufresh·2020년 3월 25일
0

Effective Java 3/E

목록 보기
9/9
post-thumbnail

블로그에 게시하는 위 글은 전체적인 내용 정리가 아닌
책을 읽으면서 새로 알게된 내용이나 제가 중요하다고 생각하는 내용을 정리한 글입니다.

close()

close()를 하지 않으면 예측하지 못한 이슈를 일으키기도 한다.
(대안으로 finalizer를 사용하긴 하지만 좋은 방법은 아니다. [아이템8])
close()를 사용해야하는 대표적인 자원들은 아래와 같다.

  • InputStream
  • OutputStream
  • Connection

try-finally

close()를 할 수 있는 전통적인 방법
단일 자원이면 상관 없지만, close()를 해야하는 자원이 여러 개면 코드가 더러워진다.

InputStream inputStream = new FileInputStream("src1"); // 첫 번째 InputStream

try {

InputStream inputStream2 = new FileInputStream("src2"); // 두 번째 InputStream

  try {
    // something ...
  } finally {
    inputStream2.close();
  }
} finally {
  inputStream.close();
}

뿐만 아니라 finally 블록에서 처리를 하다가 예외가 발생하면,
그 이전의 예외를 찾을 수 없다.

try-with-resource

이걸 사용하려면 자원이 AutoCloseable 인터페이스를 구현해야한다.
(대부분의 자바 라이브러리, 서드파티 라이브러리는 구현이 되어있다.)
만약 close()해야하는 자원이 있으면 AutoCloseable을 구현해야한다.

try(InputStream inputStream = new FileInputStream("src1"); // 첫 번째 InputStream
    nInputStream inputStream2 = new FileInputStream("src2")){ // 두 번째 InputStream
        
   //something...
        
} 

훨씬 깔끔하고 간결해졌을뿐만 아니라 예외 트래킹도 수월하다.
또한 여기서도 catch절을 쓸 수 있다.

try(InputStream inputStream = new FileInputStream("src1"); // 첫 번째 InputStream
    nInputStream inputStream2 = new FileInputStream("src2")){ // 두 번째 InputStream
        
   //something...
       
} catch(Exception e){
	//something...
}
profile
공블로그

0개의 댓글