Study/이펙티브 자바 / / 2023. 8. 26. 15:43

[Effective Java 3E] try-finally 보다는 try-with-resources를 사용하라

💥 개요

자바 라이브러리에는 close 메서드를 호출, 명시적으로 close를 해야하는 경우가 많습니다.

InputStream, OutputStream, Connection 등이 대표적으로 있습니다. close를 하지 않으면 예측할 수 없는 성능 문제로 이어지기도 합니다. 이런 자원 중 상당수가 안전망으로 finalizer를 활용하고 있긴 하지만 그리 믿음직하지 못합니다.

AutoCloseable을 상속, Closable은 AutoClosable을 상속했다.

 

전통적으로 자원이 제대로 닫힘을 보장하는 수단으로 예외가 발생하거나, 메서드에서 반환하는 경우를 포함해서 try-finally가 사용됐습니다. 

위 예시를 보면 왼쪽에서 하나의 자원을 사용하는 경우는 그나마 괜찮지만, 2개 이상의 자원을 close해야 하는 경우에는 가독성이 좋지않고, 코드가 지저분해 보입니다.

그리고 기기에 문제가 생긴다면 firstLineOfFIle(왼쪽) 메서드 안에  readLine 메서드가 예외를 던지게 되고, 같은 이유로 close 메서드도 실패할 것 입니다. 이런 상황에서 두 번째 예외가 첫 번째 예외를 완전히 집어삼키고, 디버깅이 매우 어려워집니다. (물론 첫 번째 예외를 기록하도록 할 수 있지만, 코드가 너무 지저분해짐)

 

👍 해결방법

이런 문제들은 JAVA 7에서 제공된 try-with-resources로 해결이 가능합니다.

이 구조를 사용하려면 반드시 AutoCloseable 인터페이스를 상속해서 close 메서드를 구현해야 합니다.

미구현시 사용이 불가능 한 모습

try-with-resources를 적용하게 되면 이와 같이 짧고, 가독성이 높아질 뿐 아니라 문제를 진단하기도 훨씬 좋습니다.

firstLineOfFile 메서드를 보면 readLine (코드에는 나타나지 않은)과 close 호출 양쪽에서 예외가 발생하면, close에서 발생한 예외는 숨겨지고 readLine에서 발생한 예외가 기록됩니다.

보통의 try-finally문에서 처럼 catch도 사용이 가능합니다. 이 덕에 try문을 더 중첩하지 않고 다수의 예외를 처리할 수 있습니다.

 

꼭 회수해야 하는 자원을 다룰 때 try-finally 말고, try-with-resources를 사용하자.
예외는 없다. 코드는 더 짧고 분명해지고, 만들어지는 예외 정보도 훨씬 유용하다.
try-finally로 작성하면 실용적이지 못할 만큼 코드가 지저분해지는 경우라도
try-with-resources를 사용하면 정확하고 쉽게 자원을 회수할 수 있다.

 

❤️ 스터디 질답 정리

Q.try-with-resources를 실행하면 컴파일 시점에 어떻게 되는지?
A.컴파일 시점에 try-finally 형태로 변경됩니다.

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유