Java의 try-with-resources 구문 사용법
java의 poi를 이용해 엑셀파일을 핸들링할 일이 생겼다.
poi는 엑셀 파일을 핸들링하기 위해 workbook이라는 객체를 생성한다.
별 생각없이 객체를 생성해서 사용하는데 IntelliJ에서 아래와 같은 알림을 던져줬다.

try-with-resources으로 덮으라는데 이게 뭘까? 일단 클릭해본다.
그러면 try 구문으로 해당 라인이 변경된다.
try (Workbook workbook = new XSSFWorkbook()) {
Sheet sheet = workbook.createSheet(sheetName);
...
catch (IOException e) {
e.printStackTrace();
}
try-with-resources 구문을 왜 쓸까?
try-with-resources 구문은 Java 7부터 도입된 기능으로, 자동으로 리소스가 종료되게 지원해주는 기능이다.
만약 try-with-resources을 사용하지 않으면, 아래와 같이 명시적으로 자원을 해제해줘야 한다.
Workbook workbook = new XSSFWorkbook()
Sheet sheet = workbook.createSheet(sheetName);
...
workbook.close(); // try-with-resources을 안쓰면, workbook을 해제해줘야함
입출력 스트림, 네트워크 연결 및 데이터베이스 연결과 같이 명시적으로 자원을 해제해야 하는 경우에 사용할 수 있는데
아무 클래스에나 사용할 수 있는건 아니고, AutoCloseable 인터페이스를 상속받고 있는 클래스에만 사용이 가능하다.
Workbook 클래스도 따라 올라가다보면 AutoCloseable 인터페이스를 상속받은 걸 확인할 수 있다.


자바에서는 io와 관련된 웬만한 클래스들이 AutoCloseable 인터페이스를 상속받고 있다.
- 입출력 관련 클래스
InputStream, OutputStream, Reader, Writer 등
- 파일 관련 클래스
FileInputStream, FileOutputStream, FileReader, FileWriter 등
- 네트워크 관련 클래스
Socket, ServerSocket 등
- 데이터베이스 연결 관련 클래스
Connection, ResultSet, Statement, PreparedStatement 등
자바 9부터 Thread 클래스까지 생각보다 많은 클래스들이 try-with-resources 구문을 지원한다.
마치며
필자는 맨날 자바 별로라고 욕하고 다닌다.
하지만 try-with-resources 구문 같은걸 보면, 여전히 자바는 많은 편의성을 주기 위해서 노력하고 있는 것 같다.