프로그래밍백엔드 개발자

Java에서 try-with-resources는 어떻게 작동하고 적용되며, try-catch-finally와 어떤 점이 다른가요?

Hintsage AI 어시스턴트로 면접 통과

답변.

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()가 자동으로 호출되어 리소스가 올바르게 해제되도록 보장합니다.

주요 기능:

  • AutoCloseable 인터페이스 사용
  • 블록의 모든 종료 시 리소스 자동 해제
  • 코드의 깔끔함과 간결함 보장

트릭 질문.

여러 리소스와 함께 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-catch 구조에서 리소스를 닫지 않음
  • AutoCloseable을 구현하지 않는 객체와 함께 try-with-resources 사용 시도
  • try() 외부에 리소스를 선언하여 자동 해제를 놓침

실제 사례

부정적인 사례

코드가 try-with-resources 없이 FileInputStream을 열고, 개발자가 스트림을 닫는 것을 잊거나 오류가 없을 때만 닫습니다. 예외가 발생할 경우 스트림이 닫히지 않습니다.

장점:

  • 클래식하고 익숙한 구조

단점:

  • 리소스 누수
  • 복잡하고 반복적인 처리 코드

긍정적인 사례

try-with-resources가 사용되며, 리소스가 try 괄호 안에서 직접 선언되고 해제가 항상 보장됩니다.

장점:

  • 리소스의 보장된 닫힘
  • 최소화되고 깔끔한 코드

단점:

  • AutoCloseable 리소스에서만 사용할 수 있음