티스토리 뷰

반응형

자바 라이브러리에는 직접 close 메서드를 통해 닫아줘야 하는 것들이 많다. 가장 쉽게 접할 수 있는 Scanner 클래스부터 객체를 사용한 후 close 메서드를 통해 닫아줘야 한다.

 

이외에도 InputStream, OutputStream, java.sql.Connection 등 다양한 것들이 존재한다.

 

자원을 사용한 후 close 메서드 호출을 통해 닫아주는 것을 가볍게 생각하면 안된다. 왜냐하면 예측할 수 없는 성능 문제로 이어질 수 있기 때문이다.

try-finally


전통적으로 자원을 사용한 후 닫기 위한 방법으로 아래 예제코드와 같은 try-finally를 많이 사용했습니다.

static String firstLineOfFile(String path) throws IOException {
	BufferedReader br = new BufferedReader(new FileReader(path));
    try {
    	return br.readLine();
    } finally {
    	br.close();
    }
}

 

기존에 자주 사용하던 방법이라 나쁘지 않지만 자원의 수가 늘어난다면 문제가 생긴다.

static void copy(String src, String dst) throws IOException {
    InputStream in = new FileInputStream(src);
    try {
    	OutputStream out = new FileOutputStream(dst);
        try {
            byte[] buf = new byte[BUFFER_SIZE];
            int n;
            while ((n = in.read(buf) >= 0)
            	out.write(buf, 0, n);
        } finally {
        	out.close();
        }
    } finally {
    	in.close();
    }
}

누가 이렇게 짜.. 라고 생각할 수 있겠지만 많은 프로그래머들도 이러한 실수를 흔히 범한다. 이렇게 프로그래밍함으로써 발생하는 문제로 다양한 것들이 있지만 자세한 내용은 넘어가도록 한다.

try-with-resources


try-with-resources는 JAVA 7에서 나온 문법으로 try-finally에서 발생할 수 있는 문제들을 모두 해결해준다.

 

이 구조를 사용하기 위해서는 해당 자원이 AutoCloseable 인터페이스를 구현해야 한다. 단순히 void를 반환하는 close 메서드 하나만 있는 인터페이스이다. 수많은 클래스와 인터페이스가 이미 AutoCloseable을 구현하거나 확장했기 때문에 라이브러리를 사용함에 있어서는 걱정하지 않아도 된다.

 

위에서 소개한 두 가지 예제를 변형해보자.

static String firstLineOfFile(String path) thorws IOException {
    try (BufferedReader br = new BufferedReader(new FileReader(path))) {
    	return br.readLine();
    }
}
static void copy(String src, String dst) throws IOException {
    try (InputStream in = new FileInputStream(src);
    	 OutputStream out = new FileOutputStream(dst)) {
    	byte[] buf = new byte[BUFFER_SIZE];
        int n;
        while ((n = in.read(buf)) >= 0)
        	out.write(buf, 0, n);
    }
}

세상에.... 보다시피 try-with-resources 를 사용하면 짧고 읽기 수월할 뿐만 아니라 문제를 파악하기도 훨씬 좋다.

 

try-with-resources에서도 당연히 catch절을 사용할 수 있다. 중첩되지 않은 try문을 사용하기 때문에 좀 더 직관적이고 편리하게 여러 예외에 대해서 catch절을 사용할 수 있다.

 

close 메서드를 통해 회수해야하는 자원을 다룰 때는 finally절을 사용하는 것보다 try-with-resources를 사용하는 것이 좋다. 예외없이 무조건 더 좋다!!

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함