티스토리 뷰

Sonarqube로 소스 분석 결과를 보다가 다음과 같은 지적을 받았다. 

try-with-resources

이게 왜 문제가 된다는거고 심지어 Critical인가?? finally에서 자원 해제도 잘 했는데 왜??

 

java7 이후부터는 위의 방식처럼 자원을 열고 자원 해제를 위해 finally에서 닫아주고 하는 방식이 아니라 다음과 같이 사용하는 방법을 권고한다고 한다. 

try (
    FileReader fr = new FileReader(fileName);
    BufferedReader br = new BufferedReader(fr)
  ) {
  return br.readLine();
} catch (...) {}

즉 try 안에 FileReader, BufferedReader와 같이 자원과 관련된 객체를 만들어 주면 된다. 이렇게 하면 finally에서 이 자원을 해제해주기 위해서 닫아주는 행동을 하지 않아도 된다. 즉 try-catch-finally 에서 try-catch 로 소스가 단순해진다. 그리고 실수할 여지도 없어지니 메모리 누수를 막는데 효과적이다. 

 

그럼 어떤 클래스들이 이렇게 처리가 가능한것일까?

기준점은 바로 Closeable 을 implements를 하고 있느냐 없느냐로 판단하면 된다. 위에서 예를 든 FileReader는 다음과 같은 hierarchy를 가지고 있다. 

FileReader hierarchy

abstract class인 Reader 를 살펴보면 다음과 같다. 

public abstract class Reader implements Readable, Closeable {

위에서 얘기한대로 Closeable을 implements 하고 있다. 이걸 implements 하고 있어야지 try-with-resources가 가능한 것이다. 

 

끝!

댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30