Java - try with resources

JeongHoHyun·2024년 12월 30일

Java

목록 보기
13/23

try-with-resources

  • 에플리케이션 외부 자원을 사용하는 경우 반드시 외부 자원을 해제해야 한다.
  • 따라서 finally 구문을 반드시 사용해야한다.
try{
	// 정상 흐름
} catch {
	// 예외 흐름
} finally {
	// 반드시 호출해야 하는 마무리 흐름
}
  • 위의 패턴이 반복 되면서 자바에서는 Try with Resources 라는 편의 기능을 자바 7에서 도입했다.

예시

package exception.ex4;

import exception.ex4.exception.ConnectExceptionV4;
import exception.ex4.exception.SendExceptionV4;

public class NetworkClientV5 implements AutoCloseable{
    private final String address;
    public boolean connectError;
    public boolean sendError;

    public NetworkClientV5(String address) {
        this.address = address;
    }

    ...

    @Override
    public void close() {
        System.out.println("NetworkClientV5.close");
        disconnect();
    }
}
  • AutoCloseable 인터페이스를 구현해야한다.
  • 이 인터페이스를 구현하면 try가 끝나는 시점에 close()가 자동으로 호출된다.
  • 구현하는 close()에서 Exception이 터지지 않는다면 삭제해준다.

try with resources 변경 전

package exception.ex4;

public class NetworkServiceV4 {
    public void sendMessage(String data) {
        String address = "http://example.com";
        NetworkClientV4 client = new NetworkClientV4(address);
        client.initError(data);

        try {
            client.connect();
            client.send(data);
        } finally {
            client.disconnect();
        }
    }
}

try with resources 변경 후

package exception.ex4;

public class NetworkServiceV5 {
    public void sendMessage(String data) {
        String address = "http://example.com";

        try (NetworkClientV5 client = new NetworkClientV5(address)) {
            client.initError(data);
            client.connect();
            client.send(data);
        }
    }
}
  • 위와 같이 사용하면 try with resources 구문이다.
  • try with resources 구문은 try 괄호 안에 사용할 자원을 명시한다.
  • 이 자원은 try 블럭이 끝나면 자동으로 AutoCloseable.close()를 호출해서 자원을 해제한다.

try with resource 장점

  • 리소스 누수 방지
    • 모든 리소스가 제대로 닫히도록 보장한다.
    • 실수로 finally 블럭을 적지 않거나, finally 블럭 안에서 자원 해제 코드를 누락하는 문제를 예방 할 수 있다.
  • 코드 간결성 및 가독성
    • 명시적인 close() 호출이 필요 없어 코드가 더 간결하고 읽기 쉬워진다.
  • 스코프 범위 한정
    • 예를 들어 리소스로 사용되는 client 변수의 스코프가 try 블럭 안으로 한정된다.
    • 따라서 코드 유지보수가 더 쉬워진다.
  • 조금 더 빠른 자원 해제
    • 기존에는 try -> catch -> finally 로 catch이후에 자원을 반납했다. 하지만 Try with resource 구문은 try 블럭이 끝나면 즉시 close()를 호출 한다.
profile
Java Back-End 2022.11.01 💻~ing

0개의 댓글