Post

06 try-with-resources 패턴

06 try-with-resources 패턴

1. try-with-resources

  • 자원을 자동으로 닫아주는 try문
  • 파일, 스트림, 소켓, DB 커넥션처럼 사용을 다 한 뒤에 close() 를 호출해서 반납해야 하는 객체들을 처리할 때 쓰는 구문
  • 기본문법
    1
    2
    3
    4
    5
    
    try (자원 선언) {
     // 자원 사용
     } catch (...) {
     // 예외 처리
     }
    

2. 특징

  • try() 괄호 안에 AutoCloseable 또는 Closeable 인터페이스를 구현한 객체만 넣을 수 있음
  • try 블록이 끝나기만 하면 무조건 close() 가 자동 호출됨
  • 예외가 터지든 말든 finally 안 쓰고도 안전하게 자원 반납 가능함

3. 예시

  • 단일
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
     try (BufferedReader br = new BufferedReader(new FileReader("a.txt"))) {
        String line = br.readLine();
     } catch (IOException e) {
       e.printStackTrace();
     }
      /* 종료후
        if (br != null) {
          br.close();    // 자동 호출
        }
      */
    
  • 여러종류 동시에 사용할 경우
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
     try (
       BufferedReader br  = new BufferedReader(new FileReader("input.txt")); // 동시에 2개
       BufferedWriter bw  = new BufferedWriter(new FileWriter("output.txt")) // 동시에 2개
     ) {
        String line;
         while ((line = br.readLine()) != null) {
         bw.write(line);
         bw.newLine();
        }
     } catch (IOException e) {
       e.printStackTrace();
     }
     // 마지막 선언부터 닫히기 시작함.
    

4. close가 없는경우

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 // AUtoCloseable 인터페이스를 구현한 클래스를 직접 만듬. (
 class MyResource implements AutoCloseable {

   public void doSomething() { // 작업, Override X
     System.out.println("작업 수행"); 
   }

   @Override
   public void close() { // 닫기
     System.out.println("자원 닫음");
   }
 }

 public class Main {
   public static void main(String[] args) {
   try (MyResource r = new MyResource()) {  //클래스 사용하고,
     r.doSomething(); // 로직처리하면
   } 
  }
 }
This post is licensed under CC BY 4.0 by the author.