들어가기 전에
FileWriter 객체의 경우 파일 작업이 다 끝나고 나면 close를 이용해서 파일을 닫아주는 작업을 했습니다.
try 문에서 FileWriter 객체를 만들고, 닫는 작업까지 다 넣었을 때,
그 중간의 파일 작업에서 예외가 발생한다면 어떻게 될까요?
그럼 파일을 닫아주는 작업을 실행하지 못할 것입니다.
이번 시간에는 이런 경우에 어떻게 처리하면 좋을지 finally 문에 대해서 알아봅니다.
학습 목표
finally 문에 대해서 알아봅니다.
핵심 단어
강의 듣기
자원
우리의 프로그램은 프로그램 외부의 자원(Resource)에 접근해서 작업을 진행할 수 있습니다.
대표적인 자원으로는 파일, 네트워크, 데이터베이스 등이 있습니다.
이러한 자원들은 프로그램 외부에 존재하기 때문에 우리의 프로그램이 온전히 제어하지 못합니다.
우리의 프로그램만을 위해 존재하지 않기 때문에
읽기나 쓰기 작업을 하는 도중에 상황에 따라 연결이 불량하여 작업이 실패할 수 있습니다.
그래서 이러한 자원을 사용할 때는 자원을 붙들기 위해
파일의 경우 점유상태를 나타내기도 하고, 네트워크나 데이터베이스는 연결 상태를 유지합니다.
그리고 우리가 필요한 작업을 끝내고 나서는 자원을 놓아주는 작업을 합니다.
finally 문
그런데, try 문에서 오류가 발생하면 이후에 작업이 있더라도 catch 문으로 넘어갑니다.
그래서 자원을 놓아주는 작업을 try 문에 넣게 되면,
예외가 발생했을 때 자원을 놓아주는 작업을 하지 못하게 됩니다.
그래서 예외가 발생했든, 발생하지 않았든 자원을 일단 잡았으면 놓아주는 작업을 실행하도록 해야 합니다.
이런 경우에 사용하는 형식이 finally 문입니다.
finally 문은 try 문에서 예외가 발생했거나 발생하지 않았거나 무조건 실행됩니다.
import java.io.FileWriter;
import java.io.IOException;
public class CheckedExceptionApp {
public static void main(String[] args) {
FileWriter f = null;
try {
f = new FileWriter("data.txt");
f.write("Hello");
} catch(IOException e) {
e.printStackTrace();
} finally {
if (f != null) {
try {
f.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
파일을 놓아주는 작업을 finally에 넣게 되면 구문이 위와 같이 약간 복잡해집니다.
다음 시간에는이러한 방식을 대체하여 자원의 관리를 좀 더 편하게 할 수 있는 문법에 대해서 알아봅니다.
생각해보기
1) 자원을 붙잡는 작업과 놓아주는 작업을 하지 않는다면 어떤 일이 발생할까요?
참고자료
comment
붙잡지 않는다면 갑자기 다른 프로그램이 파일을 변경해버려 알 수 없는 결과가 발생할 수 있을 것 같습니다.
반대로 놓아주지 않는다면 다른 프로그램이 해당 파일을 사용할 수 없게 될 것입니다.