개발자라면 누구나 한 번쯤 파일을 읽고, DB 연결을 하고, 자원을 다뤄본 경험이 있을 겁니다. 그럴 때마다 꼭 따라오는 이야기가 있죠.
"자원 해제를 잊지 말자!"
처음에는 try-catch-finally
로 자원을 닫았고, 나중에는 try 블록 안에서 자동으로 자원을 닫아주는 try-with-resources를 알게 되었죠. 하지만 그냥 문법만 알고 넘어가는 걸로는 부족합니다. 왜 필요한지, 어떤 상황에서 쓰면 좋은지, 어떤 장점이 있는지 실무에서 제대로 느끼고 쓰는 게 더 중요합니다.
그래서 오늘은 자바 개발자라면 반드시 알아야 할 try-with-resources에 대해 정리해보려고 합니다.
자바에서 try-with-resources
는 AutoCloseable
인터페이스를 구현한 객체를 try 구문의 괄호 안에 선언하면, 블록이 종료될 때 자동으로 close()
메서드를 호출하는 기능입니다.
try (BufferedReader br = new BufferedReader(new FileReader("path"))) {
return br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
위 코드에서 BufferedReader
는 AutoCloseable
을 구현하고 있으므로, try 블록이 끝나면 자동으로 close()가 호출됩니다. 이게 없으면 직접 close()
를 호출해야 하고, 예외가 발생하면 닫지 못하는 경우도 생길 수 있죠.
기존의 try-catch-finally
방식과 비교해봅시다.
// 기존 방식
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader("path"));
return br.readLine();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
finally
에서 close()를 호출해야 함 → 코드가 길어짐try (BufferedReader br = new BufferedReader(new FileReader("path"))) {
return br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
깔끔하게 해결되죠? 😉
자원 해제 과정에서도 예외가 발생할 수 있습니다. 기존 방식에서는 이를 무시하거나 또 다른 try-catch로 감싸야 했죠.
하지만 try-with-resources는 메인 예외는 그대로 유지하면서, 자원 해제 중 발생한 예외는 Suppressed Exception
으로 따로 기록합니다.
class CustomResource implements AutoCloseable {
@Override
public void close() throws Exception {
throw new Exception("Close Exception 발생");
}
void process() throws Exception {
throw new Exception("Primary Exception 발생");
}
}
public class Main {
public static void main(String[] args) throws Exception {
try (CustomResource resource = new CustomResource()) {
resource.process();
}
}
}
출력 결과:
Exception in thread "main" java.lang.Exception: Primary Exception 발생
at CustomResource.process(CustomResource.java:9)
at Main.main(Main.java:5)
Suppressed: java.lang.Exception: Close Exception 발생
at CustomResource.close(CustomResource.java:5)
at Main.main(Main.java:4)
이처럼 try-with-resources는 자원 해제 중 발생하는 예외도 놓치지 않고 기록합니다.
📌 파일 읽기/쓰기: BufferedReader
, FileReader
, FileWriter
등
📌 데이터베이스 연결: JDBC Connection
, Statement
, ResultSet
등
📌 네트워크 소켓: Socket
, InputStream
, OutputStream
등
📌 기타 자원 관리가 필요한 경우: Scanner
, ZipFile
등
자바에서 자원을 다룰 일이 생긴다면, 거의 대부분 try-with-resources를 쓸 수 있습니다.
항목 | 기존 try-catch-finally | try-with-resources |
---|---|---|
코드 길이 | 길고 복잡함 | 짧고 깔끔함 |
예외 처리 | 중첩 try-catch 필요 | Suppressed 예외 자동 처리 |
자동 해제 | 수동 해제 필요 | 자동 해제 |
가독성 | 낮음 | 높음 |
하드웨어가 좋아지고 메모리도 넉넉해진 지금, 자원 해제를 잊어버리는 경우가 많아졌습니다. 하지만 메모리는 곧 돈입니다. 적은 코드로 자원을 깔끔하게 관리하는 것은 개발자의 센스이자 실력이라고 생각합니다.
try-with-resources
는 단순한 문법이 아닌, 안정성과 가독성을 모두 챙길 수 있는 무기입니다.
이 글을 통해 여러분의 코드도 더 안전하고, 더 우아해지길 바랍니다. 오늘도 좋은 코드 작성하세요! ✨