목차
개요
자바 프로그램에서 자원을 효율적으로 관리하는 것은 중요한 과제입니다. 자원 관리를 잘못하면 메모리 누수, 파일 잠금 등의 문제가 발생할 수 있습니다. 자바에서는 주로 두 가지 방법으로 자원을 관리합니다: try-with-resources
와 try-finally
. 여기서는 이 두 방법의 차이점, 장단점 및 사용 예제를 비교하여 설명합니다.
try-with-resources
try-with-resources
는 자원을 자동으로 닫아주는 구문입니다. AutoCloseable
인터페이스를 구현한 자원에 대해 사용되며, 자원을 명시적으로 닫을 필요 없이 try
블록이 끝나면 자동으로 닫힙니다.
장점
- 자동 자원 관리:
try
블록이 종료되면 자동으로 자원이 닫힙니다. - 간결한 코드: 자원 닫기 로직이 필요 없어 코드가 간결해집니다.
- 자원 누수 방지: 자원이 자동으로 닫히므로 자원 누수를 방지할 수 있습니다.
단점
- 숨겨진 예외: 자원을 닫는 과정에서 발생하는 예외가 숨겨질 수 있습니다. 이러한 예외는
Throwable.addSuppressed
를 통해 접근할 수 있습니다. AutoCloseable
구현 필요:AutoCloseable
인터페이스를 구현하지 않은 자원에는 사용할 수 없습니다.
예제
import java.io.*;
public class Main {
public static void main(String[] args) {
try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out))) {
String answer = solution(br);
bw.write(answer);
bw.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
static String solution(BufferedReader br) throws IOException {
// ... (생략된 로직)
return "example result";
}
}
try-finally
try-finally
는 자원을 명시적으로 닫아주는 구문입니다. 자원을 try
블록 내에서 사용하고, finally
블록에서 자원을 닫아줍니다.
장점
- 명시적 자원 관리: 자원을 닫는 과정에서 발생하는 예외를 명시적으로 처리할 수 있습니다.
- 유연성:
AutoCloseable
을 구현하지 않은 자원에도 사용할 수 있습니다.
단점
- 복잡한 코드: 자원을 여러 번 사용하는 경우 코드가 복잡해질 수 있습니다.
- 자원 누수 위험: 자원을 명시적으로 닫아야 하므로, 실수로 자원을 닫지 않을 가능성이 있습니다.
예제
import java.io.*;
public class Main {
public static void main(String[] args) {
BufferedReader br = null;
BufferedWriter bw = null;
try {
br = new BufferedReader(new InputStreamReader(System.in));
bw = new BufferedWriter(new OutputStreamWriter(System.out));
String answer = solution(br);
bw.write(answer);
bw.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null) br.close();
if (bw != null) bw.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
static String solution(BufferedReader br) throws IOException {
// ... (생략된 로직)
return "example result";
}
}
비교
1. 자원 관리
try-with-resources
: 자원이 자동으로 닫힘try-finally
: 자원을 명시적으로 닫아야 함
2. 코드 가독성
try-with-resources
: 코드가 간결하고 가독성이 높음try-finally
: 코드가 장황해질 수 있음
3. 예외 처리
try-with-resources
: 자원을 닫는 과정에서 발생하는 예외는 숨겨질 수 있음try-finally
: 자원을 닫는 과정에서 발생하는 예외를 명시적으로 처리할 수 있음
4. 자원 누수 방지
try-with-resources
: 자원이 자동으로 닫혀 자원 누수를 방지할 수 있음try-finally
: 자원을 명시적으로 닫아야 하므로 자원 누수 위험이 있음
결론
try-with-resources
구문은 코드가 더 간결하고, 자원 관리가 자동화되어 있어 자원 누수를 방지하는 데 유리합니다. AutoCloseable
을 구현한 자원(예: BufferedReader
, BufferedWriter
, FileInputStream
, FileOutputStream
등)을 사용하는 경우 try-with-resources
구문을 사용하는 것이 더 좋은 선택입니다. 반면, 자원이 AutoCloseable
을 구현하지 않았거나, 자원을 닫는 과정에서 특별한 처리가 필요한 경우 try-finally
를 사용할 수 있습니다. 그러나 일반적인 경우에는 try-with-resources
를 사용하는 것이 더 권장됩니다.
'프로그래밍 언어 > 자바' 카테고리의 다른 글
ArrayList, LinkedList, Vector 차이 (0) | 2024.04.22 |
---|---|
일급 컬렉션 (0) | 2024.04.04 |