본문 바로가기
Web

[Java] Resource를 다룰 때 예외처리(finally, AutoCloseable)

by DuncanKim 2022. 7. 17.
728x90

[Java] Resource를 다룰 때 예외처리(finally, AutoCloseable)

 

1. finally를 쓰는 이유

 

자바가 프로그램 외부에 있는 데이터에 액세스 할 때 생기는 문제들이 있다.

외부에 있는 데이터는 DB, Network, File 등이 있다. 이것들을 Resource라고 하는데 리소스는 자바 내부의 변수나 객체들과 비교해보았을 때, 다양한 예외적 상황이 생길 수 있다.

 

리소스를 자바로 사용할 때, 데이터를 붙잡고 있는 행위를 하고 있다가 놔주는 것이 close()이다.

 

FileWriter f; // => f가 전역 변수여야 finally에서 f 사용이 가능해진다.

try{
    f = new FileWriter("data.txt");
    f.write("Hello");
    //f.close(); // close를 하기 전에 예외가 발생할 수 있기에 finally로 처리해야 한다.
} catch(IOException e){

} finally {
	f.close(); 
}

 

위의 코드는 try-catch를 통해 예외를 처리하는 모습을 보여준다.

이 중 f.close()가 따로 빠져 나와서 finally문 안에 들어있는 것을 볼 수 있다. 

 

왜 따로 빠져나와 있냐고 하면, 코드를 실행했을 때, f.write()까지만 실행했는데, 오류가 생길 수도 있다. 그럴 경우 f.close()는 쓰이지 못하고 오류가 생겨버린다. 한편, finally는 예외가 발생했든 하지 않았든 들러서 처리를 해주고 가는 부분인데 이를 활용해서 f.close()가 예외 발생 여부에 상관없이 꼭 실행이 되도록 만들어 놓은 것이다.

 

그렇지만 위의 방식대로만 해놓으면, finally의 f부분에 오류가 생기는 것을 알 수 있다.

왜냐하면, 현재 f가 초기화 되어있지 않은 상황이라서, 만약 try 문 안에서 오류를 일으킨다면, finally에서 쓰는 객체 참조 변수 f가 값이 없어져 버리는 상황이 발생할 수 있기 때문이다.

 

그렇기 때문에 아래와 같이 null값을 초기화 값으로 넣어준다.

 

FileWriter f = null;

try{
    f = new FileWriter("data.txt");
    f.write("Hello");
} catch(IOException e){

} finally {
    if f != null{
        try{
            f.close();
        }catch(IOException){

        }
}

 

그런데 close()도 IOException이 일어날 수 있기 때문에 finally문 안에서 try-catch를 해주어야 한다. 조금 코드가 복잡해지는 느낌이 드는데, 자바에서는 자동 리소스 닫기 기능을 지원해준다. 

 

 

 

2. try with resource statement(자동 리소스 닫기)

 

자바 7부터 지원하는 기능이다. 위의 방식 처럼 예외를 처리하면 close()가 필요한 예외처리를 할 때 코드가 난잡해지는 현상을 겪을 수 있다.

 

만약 클래스가 인터페이스 중에 AutoCloseable을 구현하고 있으면, 그러면 자동 리소스 닫기를 사용할 수 있다.

AutoCloseable을 지원한다.

 

try문 옆 괄호안에 close()를 필요로 하는 클래스를 인스턴스화한 코드를 집어넣고, 아래와 같이 작성한다.

try (FileWriter f = new FileWriter("data.txt")) {
	f.write("Hello");
	// f.close(); -> 필요 없는 코드이다. 자동으로 해준다.
} catch(IOException e){

}

위의 코드와 같은 코드라는 것이 믿기지 않을 정도로 줄어든 것을 볼 수 있다.

728x90

'Web' 카테고리의 다른 글

[Java] Wrapper 클래스  (0) 2022.07.18
[Java] throws  (0) 2022.07.17
[Java] ArrayList의 정의, 직접 구현해보기  (0) 2022.07.16
[Java] Random 함수의 작동원리  (0) 2022.07.15
[Java] 접근제한자(public, default, protected, private)  (0) 2022.07.14

댓글