초기버전의 java를 쭉 사용해 왔다면, 하나하나 기능이 추가될 때마다 그 유용함과 편리함을 몸소 체험했겠지만, 그동안 개발을 하면서 사용한 버전이 6이나 7이 대부분이었다보니 그럴 일이 없었던 것 같다.
그런 의미에서 java7에 오면서 새롭게 추가되거나 변경된 사항들에 대해서 살펴보려 한다.
이전까지는 예외처리르 ㄹ위해 try-catch문장을 사용했다. 이 부분에서 catch로 잡아주는 코드의 가독성이 떨어졌다.
public void scanFile(String fileName, String encoding){
Scanner scanner = null;
try{
scanner = new Scanner(new File(fileName), encoding);
System.out.println(scanner.nextLine());
}catch(IllegalAccessException iae){
iae.printStackTrace();
}catch(FileNotFoundException ffe){
ffe.printStackTrace();
}catch(NullPointerException npe){
npe.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}finally{
if(scanner != null){
scanner.close();
}
}
}
위의 예시를 보면 파일명이 한글일 경우 타입명시를 해줘야 한다. 인코딩 타입이 존재하지 않을 경우에, IllegalArgumentException이 발생할 것이고, 파일이 존재하지 않을 경우에는 FileNotFoundException이 발생할 것이다. 파일명이나 인코딩 타입이 NullPointerException이 발생할 수 있다.
지금까지는 일일이 발생할 만한 case에 맞춰서 catch블록을 만들어 처리하고, 마지막에 Exception 클래스로 catch해주는 것이 일반적이었다.
그러나 이제 java7부터는 다음과 같이 처리할 수 있다.
public void newScanFile(String fileName, String encoding){
Scanner scanner = null;
try{
scanner = new Scanner(new File(fileName), encoding);
System.out.println(scanner.nextLine());
}catch(IllegalArgumentException | FileNotFoundException | NullPointerException exception){
exception.printStackTrace();
}finally{
if(scanner != null){
scanner.close();
}
}
}
try-with-resource(리소스와 함께 처리하는 try문장)이다.
아래 예시를 보자.
public void newScanFileTryWithResource(String fileName, String encoding){
try(Scanner scanner = new Scanner(new File(fileName), encoding)){
System.out.println(scanner.nextLine());
}catch(IllegalArgumentException | FileNotFoundException | NullPointerException exception){
exception.printStackTrace();
}
}
이 구문의 특징은 다음과 같다.
java5부터 추가된 java.io.Closeable인터페이스를 구현한 클래스들은 명시적으로 close()메소드를 사용하여 닫아줘야했지만,
java7에 추가된 AutoCloseable 인터페이스를 상속한 클래스들은 앞서 살펴본 try-with-resource구문을 사용할 수 있다.
AutoCloseable을 상속한 클래스들은 아래와 같다. (이외에도 많다.)
출처 : 자바의 신(이상민 저)