Item 9 : try-finally 보다는 try-with-resources를 사용하라
2021. 7. 9. 01:26
try-finally 는 close()를 해야 할 상황에 자주 사용한다.
책에서는 InputStream, OutputStream, java.sql.Connection등의 예시를 보여주고있다
간단하게나마 자원을 반환하기 위해 close를 사용한다고 이해하고 있지만
다른 클래스와 뭐가 다르길래 close를 해줘야 할까?
일단 이 챕터의 내용은 try-finally에서 사용하는 자원이 많아 질 경우 close를 위한
구조가 복잡해지는 문제가 있기 때문에 try-with-resource를 사용하라는 의미의 챕터이다.
나는 크게
- close를 해줘야하는 이유
- try-with-resource 사용방법
에 대해 포스팅 해보겠다.
close 해줘야 하는 이유
java.io 패키지의 구조는
- Reader
- BufferedReader
- InputStreamReader
- FileReader
- Writer
- BufferedWriter
- InputStreamWriter
- FileWriter
이런식으로 구성되어 있다.
java.io 는 하드디스크에 저장되어 있는 파일을 메모리로 가져오는데
이 경우에 stream을 연결하여 읽어들인다.
그런데 이 과정에서 io는 메모리 자원이 아닌 하드 디스크 자원을 사용한다.
하드디스크 자원은 공용 자원이기 때문에 사용후에는 무조건 반납을 해주어야
다른 곳에서 파일을 사용 할 수 있기 때문에 close를 꼭 해주어야한다.
try- with -resource 구조
try-catch와 비교해서 다른점을 보겠다.
- try- catch
Scanner scanner = null;
try {
scanner = new Scanner(new File("test.txt"));
while (scanner.hasNext()) {
System.out.println(scanner.nextLine());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (scanner != null) {
scanner.close();
}
}
- try- with - resource // 자원 하나 일 때
try (Scanner scanner = new Scanner(new File("test.txt"))) {
while (scanner.hasNext()) {
System.out.println(scanner.nextLine());
}
} catch (FileNotFoundException fnfe) {
fnfe.printStackTrace();
}
- try- with resource // 자원이 여러개 일때
try (Scanner scanner = new Scanner(new File("testRead.txt"));
PrintWriter writer = new PrintWriter(new File("testWrite.txt"))) {
while (scanner.hasNext()) {
writer.print(scanner.nextLine());
}
}
주의 사항은 AutoCloseable 구현체의 확장자 형태만 try 괄호 안에 포함되어 자동으로 close 될 수 있다.
'책 > 이펙티브자바' 카테고리의 다른 글
Item 11 : equals를 재정의하려거든 hashCode도 재정의하라 (0) | 2021.07.11 |
---|---|
Item 10 : equals는 일반 규약을 지켜 재정의하라 (0) | 2021.07.10 |
Item 8 : finalizer와 cleaner 사용을 피하라 (0) | 2021.07.08 |
Item 7 : 다 쓴 객체 참조를 해체하라 (0) | 2021.07.06 |
Item 6 : 불필요한 객체 생성을 피하라 (0) | 2021.07.06 |