백엔드 개발자 블로그

[Effective Java] Item9. try-finally보다는 try-with-resources를 사용하라 본문

Java

[Effective Java] Item9. try-finally보다는 try-with-resources를 사용하라

backend-dev 2024. 3. 30. 23:13

상황

InputStream, OutPutStream, java.sql.Connection과 같은 자원들은 사용 후에 close()메서드를 통해 자원을 회수 해줘야 합니다. 예측하기 어려운 성능 문제로 이어지기도 하기에 곡 close()를 해줘야 됩닌다.

 

try-finally 문제점

  1. try문과 finally 내에서 모두 예외가 발생하는 경우 디버깅이 어렵습니다.
  2. 코드가 지저분합니다.
    • finally {br.close();} 코드를 작성할 작성 해줘야 됩니다.
    • 1번 문제 해결을 위해 예외 설정 코드를 추가하게 되면 코드가 지저분해집니다.
static String firstLiseOfFile(String path) throws IOException {
    BufferedReader reader = new BufferedReader(new FileReader(path));
    try {
        return br.readLine(); 
    } finally {
        br.close();  
    }
}

 

try-with-resources로 해결

try-finally의 문제점은 자바 7에서 나온 try-with-resources를 통해 해결할 수 있습니다.

try-with-resources를 사용하면 try 문 외에서 발생한 예외는 "숨겨졌다.(suppressed)"라는 꼬리표를 달고 출력됩니다.

 

1. try-with-resources 를 사용하려면 AutoCloseable 인터페이스의 close() 함수를 구현해야합니다.

  • 자바 라이브러리들은 이미 AutoCloseable를 구현하거나 되어 있어서 아래와 같이 바로 사용이 가능합니다.
  • 구현이 안된 경우 AutoCloseable 인터페이스를 구현하면 됩니다.

2. try(자원 생성)  {자원 사용 코드}

 

 

static String firstLiseOfFile(String path) throws IOException {
    try (BufferedReader reader = new BufferedReader(new FileReader(path));) {
        return br.readLine();
    }
}

 

핵심정리

꼭 회수해야하는 자원을 다룰 때는 try-with-resources를 사용하도록 하자. 

  • 코드는 더 짧고 분명해진다.
  • 만들어지는 예외 정보도 훨씬 유용하다.