728x90
목차
- 개요
- try-catch-finally
- try-with-resource란?
- try-with-resources를 사용해야 하는 이유
- 결론
1. 개요
- 자바7 이전에는 다 사용하고 난 자원(resource)를 반납하기 위해 try-catch-finally구문을 사용했다.
- 클라이언트가 자원 반납을 놓치는 경우 예측할 수 없는 성능 문제가 발생되기도 한다.
- 자원을 쉽게 회수할 수 있는 방법으로 try-with-resource가 자바7 부터 등장했다.
2. try-catch-finally란?
public static void main(String[] args) {
FileWriter f = null;
try {
f = new FileWriter("data.txt");
f.write("Hello");
} catch (IOException e) {
e.printStackTrace();
} finally {
if (f != null) {
try {
f.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
- Java7 이전에 try-catch-finally 코드를 보면 위와 같이 리소스를 생성하고, 반납한다.
- 리소스의 생성은 try 구문에서, 리소스의 반납은 finally 구문에서 하다보니,
- 리소스를 생성하고, 반납을 빼먹는 경우가 종종 발생했다.
3. try-with-resource란?
- 자바 7버전 이후에 추가된 try-with-resources 기능은 try 구문에 리소스를 선언하고, 리소스를 다 사용하고 나면 자동으로 반납(close)해주는 기능이다.
- 그렇다면 모든 자원을 닫아주냐?
- 아래와 같이 AutoCloseable이라는 인터페이스를 가지고 있다면 try-with-resources 문법이 사용가능하다.
- 코드로 보면 다음과 같다.
public static void main(String[] args) {
try (FileWriter f = new FileWriter("data.txt")) {
f.write("Hello");
} catch (IOException e) {
e.printStackTrace();
}
}
- 이 코드는 위에 try-catch-finally를 구현한 코드와 똑같이 동작한다.
- 그림과 같이 close가 중복이라고 IDE에서 알려주고 있으며 자동으로 내부적으로 자원을 반납 해준다는 것이다.
4. try-with-resources를 사용해야 하는 이유
public class FirstError extends RuntimeException {
}
public class SecondError extends RuntimeException {
}
public class MyResource implements AutoCloseable {
public void doSomething() {
System.out.println("Do something");
throw new FirstError();
}
@Override
public void close() throws Exception {
System.out.println("Close My Resource");
throw new SecondError();
}
}
- 위와 같이 코드가 있고 AppRunner에서 코드를 돌려보자
1-1. try-catch-finally 사용
- 실행 결과를 보자.
- doSomething에서 먼저 FisrtError가 났으나 마지막 최상단에 SecondError를 나타내고 있다.
1-2. try-with-resource 사용
- 실행 결과를 보자
- 가장 먼저 에러가 발생한 FirstError뒤에 close를 하면서 SecondError와 같은 에러가 발생하면 뒤에다 쟁여 놓고 첫번째에러를 먼저 보여주고 Suppressed 뒤에 나머지 쟁여놓은 에러를 보여준다.
- 즉, 뒤에 발생한 에러는 첫번째 발생한 에러 뒤에다 쌓아두고(Suppressed) 처음 발생한 에러를 중요시 여긴다.
- 또한 중복으로 try-catch를 만들어야 하는 경우에도 실수를 할 가능성이 높다.
5. 결론
- 우리는 아래와 같은 이유로 자바7 이상 버전을 사용하고 있다면
try-catch-finally
가 아닌try-with-resources
를 사용해야 한다.
- try-finally와 달리 뒤에 발생한 에러는 첫번째 발생한 에러 뒤에 쌓아두고(Suppressed) 처음 발생한 에러를 중요시 여긴다. 즉, 디버깅이 쉬워진다.
- 번거로운 자원 반납 작업을 하지 않아도 된다.
- 코드를 간결하게 만들 수 있다.
참고
반응형
'Java & Kotlin' 카테고리의 다른 글
ParallelStream은 항상 Stream보다 성능이 좋을까? (0) | 2023.04.11 |
---|---|
자바8에 추가된 Stream에 대해 알아보자 (0) | 2023.04.10 |
자바의 IO와 (New)NIO란? (0) | 2023.04.09 |
자바에서 transient 는 어떤 키워드 인가? (0) | 2023.04.03 |
Sync(동기)vs Async(비동기) / Blocking vs Non-blocking (0) | 2023.03.30 |