티스토리 뷰
주의 사항!
- 이 글은 제가 직접 공부하는 중에 작성되고 있습니다.
- 따라서 제가 이해하는 그대로의 내용이 포함됩니다.
- 따라서 이 글은 사실과는 다른 내용이 포함될 수 있습니다.
자바 7에서 새로 추가된 try - with - resources를 사용하면 예외 발생 여부와 상관없이 사용했던 리소스 객체(각종 입출력 스트림, 서버 소켓, 소켓, 각종 채널)의 close() 메서드를 호출해서 안전하게 리소스를 닫아줍니다. 리소스란 여러 가지 의미가 있겠지만 여기서는 데이터를 읽고 쓰는 객체라고 생각해 둡니다. 예를 들어 파일의 데이터를 읽는 FileInputStream 객체와 파일에 쓰는 FileOutputStream은 리소스 객체라고 보면 됩니다.
다음은 리소스 객체를 안전하게 닫기 위해 자바 6 이전까지 사용해 왔던 코드입니다.
FileInputStream fis = null;
try {
fis = new FileInputStream("file.txt");
...
} catch(IOException e) {
...
} finally {
if(fis != null) {
try {
fis.close();
} catch(IOException e) {}
}
}
finally 블록에서 다시 try - catch를 사용해서 close() 메서드를 예외 처리해야 하므로 다소 복잡하게 보입니다. 자바 7에서 추가된 try - with - resources를 사용하면 다음과 같이 간단해집니다. 어디를 봐도 close()를 명시적으로 호출한 곳이 없습니다.
try(FileInputStream fis = new FileInputStream("file.txt")) {
...
} catch(IOExceptioin e) {
...
}
try 블록이 정상적으로 실행을 완료했거나 도중에 예외가 발생하면 자동으로 FileInputStream의 close() 메서드가 호출됩니다. try {}에서 예외가 발생하면 우선 close()로 리소스를 닫고 catch 블록을 실행합니다. 만약 복수 개의 리소스를 사용해야 한다면 다음과 같이 작성할 수 있습니다.
try(
FileInputStream fis = new FileInputStream("file1.txt");
FileOutputStream fis = new FileOutputStream("file2.txt")
) {
...
} catch(IOExceptioin e) {
...
}
try - with - resources를 사용하기 위해서는 조건이 있습니다. 리소스 객체는 java.lang.AutoCloseable 인터페이스를 구현하고 있어야 합니다. AutoCloseable에는 close() 메서드가 정의되어 있는데 try - with - resources는 바로 이 close() 메서드를 자동을 자동으로 호출합니다. API 도큐먼트에서 AutoCloseable 인터페이스를 찾아 "All Known Implementing Classes:"를 보면 try - with - resources와 함께 사용할 수 있는 리소스가 어떤 것이 있는지 알 수 있습니다.
'공부 일지 > JAVA 공부 일지' 카테고리의 다른 글
자바, 사용자 정의 예외와 예외 발생 (0) | 2021.04.13 |
---|---|
자바, 예외 떠넘기기 (0) | 2021.04.13 |
자바, 예외 처리 코드 (0) | 2021.04.13 |
자바, 예외와 예외 클래스 (0) | 2021.04.13 |
자바, 익명 객체 (0) | 2021.04.13 |