try-finally 는 close()를 해야 할 상황에 자주 사용한다.

책에서는 InputStream, OutputStream, java.sql.Connection등의 예시를 보여주고있다

 

간단하게나마 자원을 반환하기 위해 close를 사용한다고 이해하고 있지만

다른 클래스와 뭐가 다르길래 close를 해줘야 할까?

 

일단 이 챕터의 내용은 try-finally에서 사용하는 자원이 많아 질 경우 close를 위한

구조가 복잡해지는 문제가 있기 때문에 try-with-resource를 사용하라는 의미의 챕터이다.

 

 

나는 크게

  • close를 해줘야하는 이유
  • try-with-resource 사용방법

에 대해 포스팅 해보겠다.

close 해줘야 하는 이유

java.io 패키지의 구조는

  • Reader
    • BufferedReader
    • InputStreamReader
      • FileReader
  • Writer
    • BufferedWriter
    • InputStreamWriter
      • FileWriter

이런식으로 구성되어 있다.

java.io 는 하드디스크에 저장되어 있는 파일을 메모리로 가져오는데

이 경우에 stream을 연결하여 읽어들인다.

 

 

그런데 이 과정에서 io는 메모리 자원이 아닌 하드 디스크 자원을 사용한다.

 

 

하드디스크 자원은 공용 자원이기 때문에 사용후에는 무조건 반납을 해주어야

다른 곳에서 파일을 사용 할 수 있기 때문에 close를 꼭 해주어야한다.

try- with -resource 구조

try-catch와 비교해서 다른점을 보겠다.

  • try- catch
Scanner scanner = null;
try {
    scanner = new Scanner(new File("test.txt"));
    while (scanner.hasNext()) {
        System.out.println(scanner.nextLine());
    }
} catch (FileNotFoundException e) {
    e.printStackTrace();
} finally {
    if (scanner != null) {
        scanner.close();
    }
}
  • try- with - resource // 자원 하나 일 때
try (Scanner scanner = new Scanner(new File("test.txt"))) {
    while (scanner.hasNext()) {
        System.out.println(scanner.nextLine());
    }
} catch (FileNotFoundException fnfe) {
    fnfe.printStackTrace();
}
  • try- with resource // 자원이 여러개 일때
try (Scanner scanner = new Scanner(new File("testRead.txt"));
    PrintWriter writer = new PrintWriter(new File("testWrite.txt"))) {
    while (scanner.hasNext()) {
    writer.print(scanner.nextLine());
    }
}

주의 사항은 AutoCloseable 구현체의 확장자 형태만 try 괄호 안에 포함되어 자동으로 close 될 수 있다.

+ Recent posts