📖본 포스팅은 'Effective java - 조슈아' 님의 책를 보고 작성되었습니다.
[자원이 닫히는 것을 보장하는 수단 - try-finally]
- close 메서드를 호출해 직접 닫아줘야 하는 자원이 많다. 그러나 이는 놓치기 쉬운 문제고 결과적으로 예측할 수 없는 성능 문제로 이어지기도 한다. 이런 자원 중 상당수가 안전망으로 finalizer를 사용하곤 있지만 이는 믿음직스럽지 못하다.(이전 포스팅을 참고해주세요)
- 자원이 닫히는 것을 보장하는 다른 방법으로 try-finally를 사용했는데 이는 예외 발생, 메서드에서 반환되는 경우를 포함해서 보장했다.
[이제는 자원 회수의 최선의 방책이 아닌 try-finally]
static String firstLineOfFile(String path) throws IOException{
BufferedReader br = new BufferedReader(new FileReader(path));
try{
return br.readLine();
}finally {
br.close();
}
}
위의 코드처럼 try문이 한 개만 들어가는 경우라면 사용해도 무방해보인다 그러나 아래와 같이 늘어나는 경우라면 말이 달라지게 된다.
static String firstLineOfFile(String src, String dst) throws IOException{
InputStream in = new FileInputStream(src);
try{
OutputStream out = new FileOutputStream(dst);
try{
byte[] buf = new byte[BUFFER_SIZE];
int n;
while ((n=in.read(buf)) >= 0)
out.write(buf,0,n);
}
}finally {
br.close();
}
}
- 자원을 하나 더 사용해야 하는 경우라면 프로그래머가 실수를 저지르게 될 수 있다.
- 이를 해결하기 위해서 나온 것이 try-with-resources이다.
[자원 회수의 최선의 방책이 된 try-with-resources]
- AutoCloseable 인터페이스 구현
- 단순히 void를 반환하는 close 메서드 하나만 덩그러니 정의한 인터페이스다.
- 이는 닫아야 하는 자원을 뜻하는 클래스를 작성한다면 AutoCloseable를 만드시 구현해야 한다.
static void copy(String src, String dst) throws IOException{
try (InputStream in = new FileInputStream(src);
OutputStream out = new FileOutputStream(dst)){
byte[] buf = new byte[BUFFER_SIZE];
int n;
while ((n=in.read(buf))>=0)
out.write(buf,0,n);
}
}
- 복수의 자원을 처리함으로써 짧게 코드를 구현할 수 있다.
[핵심 정리]
- 꼭 회수해야 하는 자원을 다룰 땐 try-finall문 말고 try-with-resources를 사용해서 처리하자.
- 코드가 더 짧아지고 더 분명해지며 만들어지는 예외 정보도 훨씬 유용하기 때문이다.
- 더 간결한 코드와 명확한 코드 작성을 위해서 try-with-resources문을 사용하자!!!
'Java > 이펙티브 자바(Effective Java)' 카테고리의 다른 글
[이펙티브 자바(Effective Java)][모든 객체의 공통 메서드] - 10. equals는 일반 규약을 지켜 재정의하라 (0) | 2022.04.12 |
---|---|
[이펙티브 자바(Effective Java)] - 3장 모든 객체의 공통 메서드 (0) | 2022.04.12 |
[이펙티브 자바(Effective Java)][객체 생성과 파괴] - 8. finalizer와 cleaner 사용을 피하라 (0) | 2022.04.11 |
[이펙티브 자바(Effective Java)][객체 생성과 파괴] - 7. 다 쓴 객체 참조를 해제하라 (0) | 2022.04.11 |
[이펙티브 자바(Effective Java)][객체 생성과 파괴] - 6.불필요한 객체 생성을 피하라 (0) | 2022.04.08 |