본문 바로가기
Language/Java

[JAVA] 프로그램의 안전벨트, try-catch-finally 실행 순서 완벽 가이드

by Papa Martino V 2026. 1. 20.
728x90

try-catch-finally
try-catch-finally

 

 

자바 프로그래밍에서 예외 처리는 단순히 에러를 막는 것을 넘어, 프로그램의 연속성과 자원의 무결성을 보장하는 핵심 메커니즘입니다. 특히 try-catch-finally 구문은 가장 기본적인 예외 처리 방식이지만, return 문이 포함되거나 예외가 중첩될 때의 실행 순서는 숙련된 개발자조차 간혹 혼동하곤 합니다. 오늘은 자바 가상 머신(JVM)이 이 구문들을 어떤 논리로 처리하는지, 그리고 실무에서 마주칠 수 있는 특수한 상황별 실행 순서를 심도 있게 분석해 보겠습니다.

1. try-catch-finally의 기본 정의

이 구문은 크게 세 가지 블록으로 구성됩니다. 각 블록의 역할은 명확합니다.

  • try: 예외가 발생할 가능성이 있는 코드를 포함합니다.
  • catch: 예외가 발생했을 때 이를 처리하는 로직을 담습니다.
  • finally: 예외 발생 여부와 상관없이 무조건 실행되어야 하는 코드를 담습니다. (예: DB 연결 종료, 파일 클로즈 등)

2. 상황별 실행 순서 분석

프로그램의 흐름은 예외 발생 여부와 catch 블록의 유무에 따라 크게 세 가지 경로로 나뉩니다.

2.1 예외가 발생하지 않았을 때

가장 이상적인 흐름입니다. 프로그램은 평온하게 실행됩니다.

실행 순서: try 블록 실행 → finally 블록 실행

2.2 예외가 발생하고 catch에 성공했을 때

발생한 예외 타입이 catch 문에서 정의한 타입과 일치할 때의 흐름입니다.

실행 순서: try (예외 발생 시점까지) → catch 블록 실행 → finally 블록 실행

2.3 예외가 발생했으나 catch에 실패했을 때

발생한 예외를 처리할 catch 문이 없거나 타입이 다를 경우입니다.

실행 순서: try (예외 발생 시점까지) → finally 블록 실행 → (예외는 호출한 상위 메서드로 전파)

3. 실행 순서 요약 비교표

각 상황에 따른 실행 경로를 한눈에 파악할 수 있도록 정리했습니다.

구분 try 블록 catch 블록 finally 블록 이후 코드
정상 실행 전체 실행 건너뜀 실행 실행
예외 처리 완료 중단 전까지 실행 실행 실행 실행
예외 처리 실패 중단 전까지 실행 건너뜀 실행 중단(상위 전파)

4. Sample Example: return 문이 있을 때의 반전

가장 많이 혼동하는 사례는 trycatch 블록 안에 return 문이 있을 때입니다. finally리턴되기 직전에도 반드시 실행됩니다.

public class FinallyReturnTest {
    public static int testMethod() {
        try {
            System.out.println("1. try 블록 실행");
            return 10; // 리턴값이 결정되었지만, 잠시 보류
        } catch (Exception e) {
            System.out.println("catch 블록");
            return 20;
        } finally {
            System.out.println("2. finally 블록 실행 (무조건!)");
        }
    }

    public static void main(String[] args) {
        int result = testMethod();
        System.out.println("3. 결과값: " + result);
    }
}

위 코드의 실행 결과:

  1. 1. try 블록 실행
  2. 2. finally 블록 실행 (무조건!)
  3. 3. 결과값: 10

이처럼 return이 실행되더라도 finally는 그보다 앞서 실행되는 자바의 강력한 보장성을 확인할 수 있습니다.

5. 실무자를 위한 핵심 팁: Try-with-resources

자바 7부터는 자원 반납(close)을 위해 finally에서 일일이 코드를 작성하는 번거로움을 줄여주는 try-with-resources 구문을 제공합니다. AutoCloseable을 구현한 객체라면 블록이 끝날 때 자동으로 자원을 해제해주므로, 코드가 훨씬 간결해지고 실수할 확률이 줄어듭니다.

6. 결론

try-catch-finally의 핵심은 어떤 역경(예외) 속에서도 finally는 굳건히 자리를 지킨다는 점입니다. 시스템 자원의 고갈을 막고 안정적인 서비스를 구축하고 싶다면, 이 실행 순서의 원리를 명확히 이해하고 적재적소에 자원 해제 로직을 배치해야 합니다.


참고 문헌 및 출처

  • Oracle Java Documentation: The try-catch-finally Block
  • Herbert Schildt, "Java: The Complete Reference, 12th Edition", McGraw-Hill.
  • Baeldung, "Execution Order of Try-Catch-Finally in Java" (2025).
728x90