try-with-resources

java7부터 AutoCloseable 인터페이스를 구현한 클래스라면 try-catch-finally 구조에서 지저분하게 finally 블럭에 close()를 명시적으로 호출 하지 않아도 자동으로 close 시켜주는 쿨한 feature를 제공합니다.

하지만 옛날에 자바를 배워서 쭉 코딩은 해왔지만 새로운 코딩스타일을 선호 하지 않는 분들은 아래와 같이 코딩 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Test
public void oldStyleTryCatch() {
BufferedReader bufferedReader = null;
try {
bufferedReader = new BufferedReader(new FileReader("/myhome/test.txt"));
String line = bufferedReader.readLine();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bufferedReader != null)
bufferedReader.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}

분명 나쁜 코드는 아니지만 좋은 코드라고 할수도 없겠네요.

Oracle에서 제공하는 공식 docs를 먼저 읽어봅니다.

try 선언부에 세미콜론(;)으로 구분된 한개 이상의 리소스를 선언(declarations)을 할 수 있다고 하네요. 리소스는 java.lang.AutoCloseable를 implement 하고 있는 클래스 라면 리소스로 쓰일수 있다고 합니다.

위 코드를 try-with-resources statement 를 이용한 코드로 바꿔보겠습니다.

1
2
3
4
5
6
7
8
@Test
public void newStyleTryCatch() {
try (BufferedReader bufferedReader = new BufferedReader(new FileReader("C:\\mydev\\test.txt"));) {
String line = bufferedReader.readLine();
} catch (IOException e) {
e.printStackTrace();
}
}

훨씬 보기에 깔끔한 코드로 바뀐것을 확인 할 수 있습니다.

FileReader/Writer 등과 관련된 클래스들, DB Connection과 관련된 클래스들에 주로 많이 사용할 수 있으니 아직까지 try-with-resources statement 의 사용법을 잘 모르셨던 분들이라면 꼭 익히시길 추천합니다.

Share