try-with-resources 메커니즘은 Java 7에서 도입되어 입력/출력 스트림이나 데이터베이스 연결과 같은 리소스를 자동으로 관리하는 기능을 제공합니다. 이는 리소스 작업을 간소화하고 메모리 누수 오류를 최소화합니다.
문제의 역사:
Java 7 이전에는 finally 블록에서 수동으로 리소스를 닫아야 했으며, 이는 코드 중복과 오류를 초래했습니다. try-with-resources는 이 과정을 자동화하여 코드를 더 깨끗하고 안전하게 만들었습니다.
문제:
리소스가 명시적으로 닫히지 않으면 누수가 발생할 수 있습니다(예: 파일 핸들이 해제되지 않음, 데이터베이스 연결). 구식 방식에서는 여러 예외가 발생할 때 특히 finally 블록에서 close() 호출을 종종 잊었습니다.
해결책:
AutoCloseable 인터페이스를 구현하는 리소스가 있는 곳에서는 항상 try-with-resources를 사용해야 합니다.
사용 예:
try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) { String line = reader.readLine(); // ... } catch (IOException e) { e.printStackTrace(); }
try 블록을 종료할 때 close()가 자동으로 호출되어 리소스가 올바르게 해제되도록 보장합니다.
주요 기능:
여러 리소스와 함께 try-with-resources를 사용할 수 있나요?
네, 한 줄에 세미콜론으로 여러 리소스를 선언할 수 있습니다:
try ( InputStream in = new FileInputStream("a.txt"); OutputStream out = new FileOutputStream("b.txt") ) { // ... }
try-with-resources에서 예외를 처리해야 하나요?
아니요. 메소드에서 예외를 던지도록 선언되었거나 처리가 필요하지 않은 경우는 catch를 지정하지 않아도 되지만, 정확한 진단을 위해서는 더 자주 catch가 필요합니다.
try() 외부에서 선언된 변수를 try-with-resources의 리소스로 사용할 수 있나요?
아니요, 리소스는 반드시 try 괄호 안에서 선언되어야 하며, 그렇지 않으면 자동 해제가 작동하지 않습니다.
코드가 try-with-resources 없이 FileInputStream을 열고, 개발자가 스트림을 닫는 것을 잊거나 오류가 없을 때만 닫습니다. 예외가 발생할 경우 스트림이 닫히지 않습니다.
장점:
단점:
try-with-resources가 사용되며, 리소스가 try 괄호 안에서 직접 선언되고 해제가 항상 보장됩니다.
장점:
단점: