PHpullh
학습 라이브러리/Java/try-with-resources 심화

JAVA · 예외처리

try-with-resources 심화

AutoCloseable 리소스를 자동으로 정리하는 패턴의 심화 활용입니다.

예외처리중급try-with-resourcesAutoCloseableclosesuppressed

핵심 설명

AutoCloseable 리소스를 자동으로 정리하는 패턴의 심화 활용입니다.

Java code

import java.io.*;

public class TryWithResources {
    // AutoCloseable 구현
    static class DatabaseConnection implements AutoCloseable {
        final String name;

        DatabaseConnection(String name) {
            this.name = name;
            System.out.println("연결: " + name);
        }

        void query(String sql) {
            System.out.println("[" + name + "] " + sql);
        }

        @Override
        public void close() {
            System.out.println("해제: " + name);
        }
    }

    public static void main(String[] args) {
        // 여러 리소스 (역순으로 close)
        try (var db1 = new DatabaseConnection("primary");
             var db2 = new DatabaseConnection("replica")) {
            db1.query("SELECT * FROM users");
            db2.query("SELECT * FROM orders");
        }
        // 출력: 해제: replica -> 해제: primary (역순!)

        // 기존 변수 참조 (Java 9+)
        DatabaseConnection conn = new DatabaseConnection("legacy");
        try (conn) { // 이미 선언된 변수 사용 가능
            conn.query("SELECT 1");
        }

        // suppressed exceptions
        try (var res = new AutoCloseable() {
            public void close() throws Exception {
                throw new Exception("close 에러");
            }
        }) {
            throw new Exception("본문 에러");
        } catch (Exception e) {
            System.out.println("주 예외: " + e.getMessage());
            for (Throwable s : e.getSuppressed()) {
                System.out.println("억제 예외: " + s.getMessage());
            }
        }
    }
}

학습 팁

try 본문과 close() 모두 예외가 발생하면, 본문 예외가 주 예외가 되고 close 예외는 getSuppressed()에 저장됩니다.

주의할 점

close()에서 예외를 던지면 복잡해집니다. 가능하면 close에서는 예외를 로깅만 하고 던지지 않는 것이 좋습니다.

자주 묻는 질문

try-with-resources 심화란 무엇인가요?

AutoCloseable 리소스를 자동으로 정리하는 패턴의 심화 활용입니다.

try-with-resources 심화 학습 시 주의할 점은 무엇인가요?

close() 에서 예외를 던지면 복잡해집니다. 가능하면 close에서는 예외를 로깅만 하고 던지지 않는 것이 좋습니다.