반응형

자바에서 Stream 객체과 관련된 객체를 사용하다보면, finally부분에서 사용한 자원을 해제하는 로직을 입력하거나 예외처리가 발생한 부분에서 해제시켜야 했습니다.

아래 소스를 보겠습니다.

 

 

기존 자원 해제 방식

1. catch문에서 자원해제

public class TryWithResources {

	public void readTxtFile(String path) {
		BufferedReader bufferedReader = null;
		try {
			bufferedReader = new BufferedReader(new FileReader("e:\\text.txt"), 16 * 1024);
			String str;
			while ((str = bufferedReader.readLine()) != null) {
				System.out.println(str);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			try {
				if(bufferedReader != null) bufferedReader.close();
			} catch (IOException e1) {
				e1.printStackTrace();
			}
		} catch (IOException e) {
			e.printStackTrace();
			try {
				if(bufferedReader != null) bufferedReader.close();
			} catch (IOException e1) {
				e1.printStackTrace();
			}
		} 
	}
}

catch문이 많아진다면... 해제해야할 자원이 많아진다면... 상상만 해도 끔찍합니다.

 

 

2. finally를 통한 마지막에서 해제

public class TryWithResources {

	public void readTxtFile(String path) {
		BufferedReader bufferedReader = null;
		try {
			bufferedReader = new BufferedReader(new FileReader("e:\\text.txt"), 16 * 1024);
			String str;
			while ((str = bufferedReader.readLine()) != null) {
				System.out.println(str);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if(bufferedReader != null) bufferedReader.close();
			} catch (IOException e1) {
				e1.printStackTrace();
			}
		}
	}
}

finally는 무조건 실행되므로 마지막에 전부 자원이 해제됩니다.

catch가 더 많았다면 finally로 처리하는 모습이 비교적 가독성은 더 좋아보일 것 같습니다.

 

Try With Resources

public class TryWithResources {

	public void readTxtFile(String path) {
		try (BufferedReader bufferedReader = new BufferedReader(
        						new FileReader("e:\\text.txt"), 16 * 1024);){
			String str;
			while ((str = bufferedReader.readLine()) != null) {
				System.out.println(str);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} 
	}
}

try() 안에 자원 객체를 사용하면 try를 벗어날때 자동으로 자원을 해제해줍니다.

 

Java7부터 생긴 기능으로 자원을 실수로 해제하지 않는 실수를 막아줄 수 있기에 자원을 사용하고 예외처리를 해야할 때,  사용한다면 좋을 것 같습니다.

 

다만, 모든 자원을 무조건 해제해주는것은 아니고 AutoCloseable인터페이스로 구현된 객체들만 자원이 해제됩니다.

즉, 개발자가 작성한 코드도 자동으로 자원을 해제하고 싶다면 AutoCloseable인터페이스를 상속받아서 작성하셔야 합니다.

 

반응형