본문으로 바로가기

[Java] 자바 try-with-resource (AutoCloseable)

category Backend/Java 2021. 12. 26. 13:10

1. try-with-resource

  • 예외 발생 여부와 상관없이 사용했던 리소스 객체(데이터를 읽고 쓰는 객체들)의 close() 메소드를 호출해서 안전하게 리소스를 닫아줍니다.
  • 사용하기 위해서는 리소스 객체는 java.lang.AutoCloseable 인터페이스를 구현하고 있어야 합니다.
  • AutoCloseable은 인터페이스이며 자바 7부터 지원합니다.
  • AutoCloseable에는 close() 메소드가 정의되어 있는데 try-with-resource는 AutoCloseable 구현체의 close() 메소드를 자동으로 호출합니다.

 

AutoCloseable 인터페이스

package java.lang;

public interface AutoCloseable {
    void close() throws Exception;
}

 

try-catch-resource

try(AutoCloseable를 구현하고 있는 리소스 객체 생성;) {
    // 예외 가능성이 있는 코드  
} catch (예외클래스) {
    // 예외 처리
}

2. resource 닫기

기존 소스(자바 7 이전)

  • 다음 소스는 FileReader를 이용해 파일을 읽는 예시입니다.
  • FileReader 사용을 마치면 close() 처리해야 합니다.
FileReader fileReader = null;

try {
    fileReader = new FileReader("/Users/veneas/Desktop/dev/test.txt");
    Scanner sc = new Scanner(fileReader);
    
    while(sc.hasNextLine()) {
        System.out.println(sc.nextLine());
    }

} catch (FileNotFoundException e) {
    e.printStackTrace();

} finally {
    if (fileReader != null) {
        try {
            fileReader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

try-catch-resource

  • try-with-resource를 사용한 예시입니다.
  • 코드가 간결해지고 close()를 깜빡하고 작성하지 않는 실수를 예방할 수 있습니다.
  • 작업을 마친 후 close()를 이용해 리소스를 닫지 않을 경우엔 메모리를 과부하시켜 서버에 무리를 줄 수 있는 등의 문제가 있으므로 꼭 리소스를 닫아줘야 합니다.
try (FileReader fileReader = new FileReader("/Users/veneas/Desktop/dev/test.txt")) {

    Scanner sc = new Scanner(fileReader);

    while(sc.hasNextLine()) {
        System.out.println(sc.nextLine());
    }

} catch (IOException e) {
    e.printStackTrace();
}

3. AutoCloseable 구현

  • AutoCloseable을 implments 해서 try-with-resource를 활용할 수 있습니다.
  • close()를 오버라이딩하여 구현합니다. 

 

구현체

public class AutoCloseableImpl implements AutoCloseable {

    private String file;

    public AutoCloseableImpl(String file) {
        this.file = file;
    }

    public void read() {
        System.out.println(this.file + "를 읽습니다.");
    }

    @Override
    public void close() throws Exception {
        System.out.println("리소스를 닫습니다.");
    }
}

 

테스트

public class Exe {

    public static void main(String[] args) {

        try(AutoCloseableImpl test = new AutoCloseableImpl("file.txt")) {
            test.read();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

실행결과

  • Override 하여 구현한 close() 메소드를 자동으로 호출해 주는 것을 알 수 있습니다.