본문 바로가기

이펙티브 자바

[이펙티브 자바] 아이템 9. try-finally보다는 try-with-resources를 사용하라

try-finally 사용 예시 (비효율적)

import java.io.*;

public class TryFinallyExample {
    public static String firstLineOfFile(String path) throws IOException {
        BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader(path));
            return br.readLine();
        } finally {
            if (br != null) {
                br.close(); // 자원을 명시적으로 해제해야 함
            }
        }
    }
}

이 예시에서는 finally 블록을 사용해 파일 리더를 명시적으로 닫아야한다. 번거로울 뿐만 아니라 close 메서드에서 예외가 발생하면 원래의 예외가 가려질 수도 있어서 문제가 된다.

 

try-with-resources 사용 예시 (권장)

import java.io.*;

public class TryWithResourcesExample {
    public static String firstLineOfFile(String path) throws IOException {
        // try-with-resources 구문 사용
        try (BufferedReader br = new BufferedReader(new FileReader(path))) {
            return br.readLine(); // 자동으로 리소스를 해제해 줍니다.
        }
    }
}

이 예시에서는 BufferedReader의 인스턴스를 자동으로 관리한다. 구문이 끝나면 자동으로 BufferedReader가 닫히므로 명시적으로 자원을 해제하는 코드를 작성할 필요가 없다. 또한 try 블록 내에서 예외가 발생하더라도 자원은 안전하게 해제된다. close메서드에서 예외가 발생하는 경우에도 원래 예외를 숨기지 않고 보조 예외(suppressed exception)로 처리한다.

 

결론 : 꼭 회수해야하는 자원을 다룰 때는 try-finally 말고, try-with-resources를 사용하자.

반드시 사용하자. 예외는 없다.

코드를 더 간결하고 안정하게 만들고 자원 해제 과정에서 발생할 수 있는 잠재적인 문제를 방지한다.

혹시나 코드가 더 길어지더라도 try-with-resources를 사용하자.