본문 바로가기

개발/Java

[Java]Try-with-resource

최근 자바 기본서 한 권을 마무리하면서, 당연히 기본적인 내용은 다 알 것이라고 생각했던 부분에서 전혀 몰랐던 개념들에 대해 많이 알게 되었다.

그 중 하나가 Try-with-resource이다.

 

Try-with-resource는 Java 7 이후에 추가되었다. 일반적으로 자바에서 자원(리소스)을 사용할 때 Try { } catch { } 구문을 사용하고, 사용한 자원에 대해 close() 메서드 등을 통해 해제하는것이 일반적이다.

하지만 매번 개발자가 번거롭게 선언과 해제를 해주는 부분을 한층 더 편하게 가져가기 위해 Try-with-resource 개념이 도입되었다.

 

기존의 try-catch 구문은 아래와 같이 사용하였다. 주로 finally 구문을 선언해 리소스를 해제했다

문제는 개발자도 사람인지라.. 사용 후 리소스의 해제(close())를 빼먹으면 자원의 누수가 발생하게 된다.

속도가 중요한 시스템이거나, 장기적으로 가동되는 다소 무거운 시스템일 경우 이러한 메모리 누수는 시스템 장애로 이어질 수도 있다.

 

Try-with-resource를 사용하게 되면 아래와 같이 try 이후 소괄호에 사용할 자원을 명시해준다.

이렇게 사용하게 되면, 코드상으로 보듯이, 따로 close()를 명시해주지 않아도 사용이 끝나면 자동으로 리소스가 반납된다.

 

* 여기서 중요한 점은 아무 리소스나 Try-with-resource로 사용할 수 있는 것은 아니라는 것이다. Try-with-resource는 java.lang.AutoCloseable 인터페이스를 구현한 클래스에 한해서 사용 가능하다. 예시에서 사용한 FileInputStream은 InputStream 메서드를 extends 하고 있고, InputStream 을 따라가보면...

Closeable 인터페이스를 구현하고 있음을 알 수 있다.

 

그리고 여러개의 리소스를 사용할 때는 아래와 같이 사용하면 된다.

ps. 개념을 이해하고 사용하고자 하였으나, 사실상 사용에 일부 제약이 있기도 했다. 해당 부분에 대해서는 조금 더 공부한 후 포스팅하고자 한다.

'개발 > Java' 카테고리의 다른 글

[Java] Enum 에 대해  (0) 2023.07.09
[Java] JVM - ClassLoader(아주 얕은 수준)  (0) 2022.09.03
[Java] 자바의 메모리 영역(2)  (0) 2022.07.03
[Java]Serialization(직렬화)  (0) 2022.05.25
[Java] 자바의 메모리 영역(1)  (0) 2022.04.26