try-finally 방식
static String firstLineOfFile(String path) throws IOException {
BufferedReader br = new BufferedReader(new FileReader(path));
try {
return br.readLine();
} finally {
br.close();
}
}
try-finally는 자원을 사용한 후 반드시 반환하기 위해 finally 블록을 사용한다. 위 코드에서는 파일을 읽기 위해 BufferedReader 객체를 생성하고, 파일 읽기 작업이 끝난 후 finally 블록에서 자원을 반환(close)하고 있다.
문제점
- 예외 발생 시 자원 누수 가능성: 파일을 읽는 도중 예외가 발생하거나 다른 문제가 생기면, 자원 반환을 제대로 하지 못할 위험이 있다.
- 가독성 저하: 자원 반환을 위해 추가적인 finally 블록이 필요하고, 코드가 복잡해질 수 있다. 여러 자원을 사용할 경우 자원마다 finally 블록을 작성해야 하므로 가독성이 떨어진다.
try-with-resources 방식
static String firstLineOfFile(String path) throws IOException {
try (BufferedReader br = new BufferedReader(new FileReader(path))) {
return br.readLine();
}
}
try-with-resources는 자원을 자동으로 반환해주는 방식이다. try 블록에서 사용한 자원은 AutoCloseable 인터페이스를 구현한 자원이므로, try 블록이 끝난 후 자동으로 close()가 호출된다.
장점
- 자동 자원 회수: 자원을 명시적으로 close()하지 않아도 된다. try 블록이 종료되면 자동으로 자원을 반환하므로 예외가 발생하더라도 자원이 누수되지 않는다.
- 간결한 코드: finally 블록을 작성할 필요가 없으므로 코드가 훨씬 간결해진다. 여러 자원을 사용할 때도 try-with-resources 안에 나열하기만 하면 된다.
- 가독성 향상: 불필요한 finally 블록 없이 깔끔하게 자원 관리가 가능해지며, 자원을 안전하게 사용할 수 있다.
'Java' 카테고리의 다른 글
이펙티브 자바(Effective Java) 2장 - 아이템 11 equals를 재정의하려거든 hashCode도 재정의하라 (0) | 2024.12.03 |
---|---|
이펙티브 자바(Effective Java) 2장 - 아이템 10 equals는 일반 규약을 지켜 재정의하라 (0) | 2024.12.03 |
이펙티브 자바(Effective Java) 2장 - 아이템 8 finalizer와 cleaner 사용을 피하라 (0) | 2024.12.03 |
이펙티브 자바(Effective Java) 2장 - 아이템 7 다 쓴 객체 참조를 해제하라 (0) | 2024.12.03 |
이펙티브 자바(Effective Java) 2장 - 아이템 6 불필요한 객체 생성을 피하라 (0) | 2024.12.03 |