[JAVA] try-with-resources

JHJeong·2024년 4월 27일
0

JAVA7에서 추가된 try-with-resources 구문은 자원을 효율적으로 관리하기 위한 방법 중 하나이다. 이 구문은 파일, 네트워크 연결 또는 데이터베이스 연결과 같은 자원을 사용한 후 자동으로 해제하도록 설계되었다. 이전에는 'finally'블록에서 자원을 명시적으로 해제했어야 했는데, try-with-resources 구문을 사용하면 이 과정이 자동화되어 개발자의 실수를 줄이고 코드의 가독성을 높일 수 있다.

주요 특징

  1. 자동 자원 해제 : try 블록내에 선언된 자원은 블록이 종료될 때 자동으로 해제된다.
  2. 가독성 향상 : 코드의 복잡성을 줄이고, 자원 해제를 위한 코드를 작성할 필요가 없어진다.
  3. 예외 처리 간소화 : 자원 해제 중 발생할 수 있는 예외를 자동으로 처리할 수 있다.

사용 조건

try-with-resources를 사용하기 위해서는 해당 자원 클래스가 'AutoCloseable'인터페이스를 구현해야 한다. 이 인터페이스는 'close()' 메소드를 포함하고 있으며, 이 메소드가 자원 해제의 핵심이다.

예제 코드

해당 구문을 사용한 파일을 읽는 간단한 예제다.

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class TryWithResourcesExample {
    public static void main(String[] args) {
        // 파일 경로 지정
        String path = "example.txt";
        
        // try-with-resources 구문을 사용하여 파일을 열고 읽음
        try (BufferedReader br = new BufferedReader(new FileReader(path))) {
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            System.out.println("Error reading the file: " + e.getMessage());
        }
    }
}

/*
cat example.txt
test1
test2
test3
test4
*/

출력 결과

test1
test2
test3
test4

이 코드에서 BufferedReader는 AutoCloseable 인터페이스를 구현하고 있으므로 try() 구문 안에 선언될 수 있다. 파일 읽기 작업이 끝나면, BufferedReader의 close() 메소드가 자동으로 호출되어 자원이 해제된다. 이로써 개발자는 자원을 명시적으로 해제하는 코드를 작성할 필요가 없다.

이 구문의 도입으로 자바 개발자들을 자원 관리를 더 간편하고 안전하게 할 수 있게 되었다. 이러한 기능은 코드의 신뢰성을 높이고, 자원 누수 가능성을 줄이는 데 큰 도움이 된다.

위에서 처럼 try-with-resources 구문은 try() 괄호 안에 선언된 모든 자원에 대해 자동 해제를 보장한다. 하지만 여기서 주의할 점은, 자동으로 해제되는 자원은 try() 괄호 안에서 선언된 자원들만 해당된다는 점이 중요하다. 이 자원들은 모두 AutoCloseable 인터페이스를 구현해야하며, 이 인터페이스의 close() 메소드가 블록의 실행이 끝날 때 호출된다.

자동해제가 보장되는 조건

  1. 해제할 자원은 AutoCloseable 인터페이스를 구현해야한다. 이 인터페이스에서 close 메소드가 정의되어있어야 하며, 이 메소드는 자원을 해제하는 데 필요한 모든 코드를 포함한다.
  2. 자원은 try() 괄호 안에 선언되어야 한다. 오직 이 위치에 선언된 자원들만이 블록을 벗어날 때 자동으로 해제된다.

예를 들어, 다음과 같은 경우는 try-with-resources 자동 해제 대상이 아니다.

BufferedReader br = null;
try {
    br = new BufferedReader(new FileReader("example.txt"));
    // 여기서 파일을 읽는 작업 수행
} catch (IOException e) {
    e.printStackTrace();
}

위 코드에서 BufferedReader 인스턴스 try() 구문 밖에서 선언되었기 때문에 자동으로 해제되지 않는다. 이 경우에는 여전히 finally 블록을 사용하여 close 메소드를 명시적으로 호출해야한다.

AutoCloseable 인터페이스를 구현하는 자원들의 종류

AutoCloseable 인터페이스를 구현하는 자원들은 주로 외부 시스템과의 연결이나 파일 시스템 리소스를 관리하는 클래스들이다.

  1. 파일 I/O 자원 : FileInputStream, FileOutputStream, FileReader, FileWriter, BufferedReader, BufferedWriter, RandomAccessFile
  2. 네트워크 I/O 자원 : Socket, ServerSocket, DatagramSocket
  3. 데이터베이스 연결 자원 : Connection, PreparedStatement, ResultSet
  4. 다른 스트림 및 채널 : InputStream, OutputStream, Reader, Writer, java.nio.channels.Channel의 서버 클래스들(FileChannel)
  5. 기타 : ZipFile, Scanner, java.util.Timer(타이머 관리)
profile
이것저것하고 싶은 개발자

0개의 댓글