Java/이펙티브 자바(Effective Java)

[이펙티브 자바(Effective Java)][객체 생성과 파괴] - 9. try-finally보다는 try-with-resources를 사용하라

얄루몬 2022. 4. 11. 20:07

📖본 포스팅은 'Effective java - 조슈아' 님의 책를 보고 작성되었습니다.


[자원이 닫히는 것을 보장하는 수단 - try-finally]

  • close 메서드를 호출해 직접 닫아줘야 하는 자원이 많다. 그러나 이는 놓치기 쉬운 문제고 결과적으로 예측할 수 없는 성능 문제로 이어지기도 한다. 이런 자원 중 상당수가 안전망으로 finalizer를 사용하곤 있지만 이는 믿음직스럽지 못하다.(이전 포스팅을 참고해주세요)
  • 자원이 닫히는 것을 보장하는 다른 방법으로 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();
    }
}

위의 코드처럼 try문이 한 개만 들어가는 경우라면 사용해도 무방해보인다 그러나 아래와 같이 늘어나는 경우라면 말이 달라지게 된다.

 

static String firstLineOfFile(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 {
            br.close();
        }
    }
  • 자원을 하나 더 사용해야 하는 경우라면 프로그래머가 실수를 저지르게 될 수 있다.
  • 이를 해결하기 위해서 나온 것이 try-with-resources이다.

 

[자원 회수의 최선의 방책이 된 try-with-resources]

  • AutoCloseable 인터페이스 구현
    • 단순히 void를 반환하는 close 메서드 하나만 덩그러니 정의한 인터페이스다.
    • 이는 닫아야 하는 자원을 뜻하는 클래스를 작성한다면 AutoCloseable를 만드시 구현해야 한다.
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-finall문 말고 try-with-resources를 사용해서 처리하자.
  • 코드가 더 짧아지고 더 분명해지며 만들어지는 예외 정보도 훨씬 유용하기 때문이다.
  • 더 간결한 코드와 명확한 코드 작성을 위해서 try-with-resources문을 사용하자!!!