프로그래밍Java Backend 엔지니어

Java에서 try-catch-finally란 무엇이며 이 메커니즘을 올바르게 사용하는 방법과 고려해야 할 주의사항은 무엇인가요?

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

답변

try-catch-finally를 통한 예외 처리 메커니즘은 Java 언어가 처음 발전할 때부터 추가되었습니다. 주요 목표는 작업 코드와 오류 처리 코드를 분리하여 구조화된 오류 관리를 제공하는 것입니다.

문제: 비정상적이거나 잘못된 동작은 예외(exception)를 발생시킵니다. try-catch 없이 그 예외는 단순히 호출 스택 위로 전파될 수 있습니다. 이러한 접근 방식으로 프로그램이 비정상적으로 종료될 수 있습니다.

해결책은 try { } catch { } finally { }를 사용하는 것으로, 이는 예상되는 예외를 처리하고 리소스 해제, 파일 닫기, 트랜잭션 롤백과 같은 종료 작업을 보장하는 것입니다.

코드 예:

try { FileInputStream fin = new FileInputStream("test.txt"); int data = fin.read(); } catch (IOException e) { System.out.println("파일 작업 중 오류: " + e.getMessage()); } finally { fin.close(); }

핵심 특징:

  • try 블록은 잠재적으로 오류가 발생할 수 있는 코드를 포함합니다.
  • catch는 예외를 포착하고 처리합니다.
  • finally는 항상 실행되며, return/exception 발생 시에도 실행됩니다.

함정 질문.

finally가 실행되지 않을 수 있나요?

예, 블록 내에서 System.exit()가 호출되거나 프로세스가 비정상 종료되거나 JVM이 물리적으로 다운되면 실행되지 않을 수 있습니다.

finally 없이 try-catch를 사용할 수 있나요?

예, finally 블록은 필수가 아닙니다. 그러나 리소스 정리가 필요하다면 일반적으로 사용됩니다. Java 7부터는 try-with-resources가 사용됩니다.

finally에서 예외가 발생하면 어떻게 되나요?

finally에서 새로운 오류가 발생하면 그것이 원래의 예외를 "가리게" 되어(별도로 포착되지 않는 한), 문제가 가려질 수 있습니다.

try { throw new RuntimeException("try에서 실패"); } finally { throw new RuntimeException("finally에서 실패"); } // 최종 스택 트레이스 — 오직 "finally에서 실패"

일반적인 오류 및 안티 패턴

  • 예외 무시하기 (catch(Exception e) {} 비어 있음)
  • 원인 없이 다시 던지기 (throw e; 새로운 Exception(e) 없이)
  • finally 중단하기 (return 또는 새로운 Exception 던지기)

실제 사례

부정적 케이스

프로젝트에서 finally 블록에 IOException을 발생시킬 수 있는 코드가 포함되어 있었습니다. try에서 오류가 발생하면 원래의 예외가 완전히 사라져 오류 진단이 매우 어려워졌습니다.

장점:

  • 리소스의 보장된 해제

단점:

  • 오류 은폐
  • 디버깅의 어려움

긍정적 케이스

finally 대신 팀은 try-with-resources로 전환했습니다. 각 리소스는 AutoCloseable을 구현하며, 해제는 자동으로 이루어지며, 예외는 자체 오류 로그에 기록됩니다.

장점:

  • 올바른 리소스 해제
  • 오류 로그가 투명하게 기록됨

단점:

  • Java 7 이상 지원 필요