try-with-resources

sungs·2025년 8월 9일

자바

목록 보기
63/95

try-with-resource

예외 처리할 때 상당히 유용하다. 자동으로 close를 호출해서 자동으로 닫아주니까 말이다. 특히 네트워크 통신할 때 효과적이다.
단순히 try-catch로 예외를 처리하면 여러 문제가 생길 수 있다. 작업할 때 터진 핵심 예외를 처리하래더니 닫힐 때 터진 부가 예외를 처리한다거나 catch 이후 자원 정리, try 구문 안에 객체 생성 불가, 객체 null 체크로 인한 구문 길어짐 등 여러 문제가 있었다. try-wiht-resources 구문은 이러한 문제들을 해결해 준다.

public class ServerV5 {
    private static final int PORT = 12345;

    public static void main(String[] args) {
        log("서버 시작");
        try (ServerSocket serverSocket = new ServerSocket(PORT)) {
            log("서버 소켓 시작 - 리스닝 포트: " + PORT);
            while (true) {
                Socket socket = serverSocket.accept(); // 블로킹
                log("소켓 연결: " + socket);
                Session session = new Session(socket);
                Thread thread = new Thread(session);
                thread.start();
                // 여기에 서버를 종료할 수 있는 로직 추가
                // 예: 특정 명령어를 받거나, 프로그램 종료 신호를 처리
            }
        } catch (IOException e) {
            log("서버 소켓 예외 발생: " + e.getMessage());
        }
        log("서버 종료");
    }
}

이렇게 닫아야 되는 것만 넣어주면 자동으로 닫아주므로 close를 썼는지 확인 안 해도 된다. 게다가 핵심 예외 안에 부가 예외도 넣어서 처리해주므로 핵심 예외 대신 부가 예외가 처리된다는 문제도 해결된다. 자원 정리 중에 터진 부가 예외를 학인하고 싶으면 e.getSuppressed()으로 확인 가능하다.
resources 안에 객체도 생성 가능해 구문이 간결해진다. catch 이후에 자원 정리하던 문제도 여기선 catch 이전에 자원 정리하고 catch로 넘어가기 때문에 문제가 안 된다.
안 닫힐 수 있던 다른 자원들도 확실히 닫힌다는 장점도 있다.

profile
앱 개발 공부 중

0개의 댓글