본문 바로가기
IT/Java

try-with-resources (AutoCloseable)

by 성준하이 2024. 8. 5.
반응형

기존에 Try Catch 문을 사용할 경우

파일을 열거나 특정 url 등을 열거나 할 경우 종료 이후에 close를 반드시 해줘야만 했다.

 

그렇지 못할 경우에는 자원의 낭비가 생기고 심하게는 서버가 죽을 경우도 있다.

 

예를들어 코드가 아래와 같다.

try{
     ..이상 생략
     BufferedReader reader = new BufferedReader(new InputStreamReader(url));
     ..이하 생략
} catch (MalformedURLException e) {
     reader.close(); 
     e.printStackTrace();
     throw e;

혹은 finally 로 묶어서 닫아주고는 한다.

try{
     ..이상 생략
     BufferedReader reader = new BufferedReader(new InputStreamReader(url));
     ..이하 생략
} catch (MalformedURLException e) {
     e.printStackTrace();
     throw e;
} finally {
     reader.close();
}

 

위 코드의 단점은 여러가지가 있지만 몇가지를 말하면,

  • 실수로 닫지 못할 경우 위험함
  • 코드의 지저분함
  • 통일성 없음
  • 등등

이런 이유로 Java7 이후로 부터는 

try-with-resources

를 지원하게 되었다.

 

위 코드를 아래와 같이 가볍게 변환할수 있다.

try (BufferedReader reader = new BufferedReader(new InputStreamReader(url))){
     ..이상 생략
     ..
     ..이하 생략
} catch (...) {

자원 할당하는것을 Try 문에 묶어서 사용을 하면 자연스레 Try가 종료되면서 close가 생긴다.

즉 catch 나 finally에서 따로 코드를 구현하지 않아도 된다.

 

하지만 이때 Try 에 전달할수 있는 객체는 AutoCloseable 상속되어있는 객체들 한정이다.

(참고로 BufferedReader InputStreamReader클래스가 추상클래스 Reader를 상속 / Reader Closeable 인터페이스를 상속 / Closeable 인터페이스는 AutoCloseable인터페이스 상속 하기에 가능)

 

Java는 AutoCloseable 인터페이스를 구현하고 있는 자원에 대해 try-with-resources를 적용 가능하도록 하였고, 이를 사용함으로써 코드가 유연해지고, 누락되는 에러없이 모든 에러를 잡을 수 있게 되었다.

 

Baldung 사이트에서는 아래와 같이 소개한다.

https://www.baeldung.com/java-try-with-resources

 

반응형

댓글