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() 메소드를 자동으로 호출해 주는 것을 알 수 있습니다.
'Backend > Java' 카테고리의 다른 글
[Java] 자바 커스텀 예외 만들기(Custom Exception) (0) | 2021.12.28 |
---|---|
[Java] 자바 예외 넘기기 (throws) (0) | 2021.12.27 |
[Java] 자바 예외 처리(Exception, RuntimeException) (0) | 2021.12.25 |
[Java] DTO List 정렬 방법 (Comparator API) (0) | 2021.12.22 |
[Java] 데이터 정렬 Null 처리 (nullsFirst(), nullsLast()) (0) | 2021.12.20 |