자바 Try-With-Resources 예외 처리

Park sang woo·2024년 7월 24일
0

CS스터디

목록 보기
8/25

📒 Resource의 예외 처리

resource는 외부 데이터(DB, Network, File)를 말합니다.
이런 resource들은 자바 내부에 위치한 요소들이 아니기 때문에, 이러한 프로세스 외부에 있는 데이터에 자바 코드에서 접근하려고 할 때 문제(예외)가 발생할 수 있는 여지가 존재합니다.

입출력에 관련된 resource들에 접근해서 사용하고 나면 닫는 것이 굉장히 중요합니다.

  • 어떤 resource를 사용하다가 다른 곳에서 같은 resource에 접근해 막 사용하다보면 꼬일 수 있기 때문.


🍁 외부 텍스트 파일에 접근해서 내용을 쓰고 닫는 로직

import java.io.FileWriter;
import java.io.IOException;

public class Main {
    public static void main(String[] args) {
        FileWriter file = null;
        try {
            file = new FileWriter("data.txt");
            file.write("Hello World");
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
        	// close()에서 발생하는 예외를 처리하기 위해서 아래와같이 바꿀수도 있지만 코드가 복잡해져서 좋지않다.
            try {
                file.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

외부 resource는 사용했으면 반드시 닫아주도록 file.close()로 처리했습니다.

또한 file.close() 동작도 잘못되면 IOException이 발생할 수 있기에 이 부분도 예외 처리를 해줘야 합니다.


이러면 예외처리를 하기 위해 try-catch문을 2번 여러 번 사용하게 됩니다. 그래서 이 부분을 편하기 사용하기 위해 try-with-resources문을 자바 7버전부터 내놓아습니다.






🍁 Try With Resources문

try-with-resources문은 주로 입출력(I/O)과 관련된 클래스를 사용할 때 굉장히 유용합니다.

  • 입출력에 사용한 객체를 자동으로 반환시켜주기 때문.

try 블록에 파일을 열거나 자원을 할당하는 명령문을 명시하면, 해당 try 블록이 끝나자마자 자동으로 파일을 닫거나 할당된 자원을 해제해줍니다.

try() 이 괄호 안에 객체를 생성하는 문장을 넣으면, 따로 close()를 호출하지 않아도 try 블럭을 벗어나는 순간 자동적으로 close()가 호출됩니다.
그리고 다음에 catch 블럭 또는 finally 블럭이 수행됩니다.


import java.io.FileWriter;
import java.io.IOException;

public class Main {
    public static void main(String[] args) {
        try (FileWriter file = new FileWriter("data.txt")) { // 파일을 열고 모두 사용되면 자동으로 닫아준다
            file.write("Hello World");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

여러개의 I/O 객체일 경우 문장을 2개 이상 넣기도 가능합니다.

// try 괄호 안에 두문장 이상 넣을 경우 ';'로 구분한다.
try(
	FileInputStream fis = new FileInputStream("a.txt"); // 반드시 세미콜론으로 각 문장을 구분
    DataInputStream dis = new DataInputStream(fis)
) {
	
    while(true){
    	score - dis.readInt();
        System.out.println(score);
        sum += score;
    }
    
} catch (EOFException e){
    System.out.println("점수의 총합은 " + sum + "입니다.");
} catch (IOException ie){
    ie.printStackTrace();
}





🍁 AutoCloseable 인터페이스

try-with-resources 문이 사용 가능한 이유는 AutoCloseable 인터페이스를 구현받기 때문입니다.

FileWriter 클래스 역시 클래스 정의문에 들어가면 AutoCloseable 이라는 인터페이스를 구현한 것을 볼 수 있습니다.

try- catch 사용의 경우
자원 관리가 필요 없는 경우 : 자원을 사용하지 않는 코드 블록에서는 try-catch 문을 사용할 수 있습니다.
여러 개의 자원이나 다양한 예외 처리가 필요한 경우, try-catch 문을 사용하여 더 세부적으로 예외를 처리합니다.
자원 해제 필요 없는 객체 : AutoCloseable 인터페이스를 구현하지 않는 객체의 겨우 try-with-resources를 사용할 수 없습니다.


정리
자원을 사용하는 경우 : 파일, DB 연결, 네트워크 소켓 등과 같은 자원을 다룰 때는 try-with-resources를 사용하는 것이 좋습니다.
자원 사용이 없는 경우 : 일반적인 예외 처리나 자원 관리가 필요 없는 경우 try-catch를 사용할 수 있습니다.

profile
일상의 인연에 감사하라. 기적은 의외로 가까운 곳에 있을지도 모른다.

0개의 댓글