Try Catch 예외처리 구문을 공부하던 도중 Finally에 대해서 알게 되었다.
Finally란 Try ~ Catch 구문의 예외 처리 도중, 예외 발생 여부와 상관 없이 항상 실행할 내용이 있을 경우에만 작성하는 블록이다.
공부를 하면서 문득 이런 생각이 들었다.
항상 실행시키고자 하는 코드는 try catch 구문 블럭이 끝난 이후 블럭 바깥 라인에 작성해도 오류가 발생하든 발생하지 않든 실행이 되는데 굳이 finally가 필요한 상황이 있긴 할까? 라는 의문이다.
우선 Finally 구문을 사용하는 경우에 대해서 예를 들어보자.
보통의 경우 리소스 관리나 프로그램을 안전하게 구성하기 위해 finally라는 기능을 흔히 사용한다.
DB Connection 반환 혹은 Socket통신, Close 등등 리소스를 반환하지 않는다면 Exception이 발생할 때 마다 시스템 리소스를 잡아먹게된다.
결국 리소스 사용량이 초과되면 시스템이 뻗는?(프로그램 먹통) 현상이 발생할 수 있는데, finally구문에 리소스를 반환하는 구문을 넣으면 어떤 익셉션이 발생하더라도 실행된다.
(exception이 발생하지 않더라도 finally는 무조건 호출된다.)
public class Example {
public static void main(String[] args) {
try {
Class clazz = Class.forName("java.lang.String2");
} catch (Exception e) {
return;
} finally {
System.out.println("finally 이다.");
}
System.out.println("tryCatch 블록 종료후 실행"); //출력되지 않는다.
}
}
위와 같이 catch 블록에서 return문을 사용할 경우 finally 블록 내의 문자열은 출력하지만, 블록 바깥의 출력문은 출력되지 않는다.
다시말해 try catch 구문에서는 return문을 사용할 경우 완전히 종료하지 않고 finally 구문까지 실행하고 프로그램을 종료한다.
이것은 앞서 말했던 exception이 발생하지 않더라도 finally는 무조건 호출된다는 말에 힌트가 있는것 같다.
try catch finally 구문은 하나의 단위로서, 해당 구문이 return을 통해 종료를 시킨다고 하더라도 finally 구문이 실행 된 후 해당 예외처리 구문을 종료시킨다는 것으로 이해할 수 있다. (물론 return에 대한 반환은 메소드에 하므로 호출된 예외구문이 담긴 메소드도 종료된다)
'JAVA > BASIC' 카테고리의 다른 글
자바(JAVA) 중첩클래스 - 로컬클래스와 익명객체의 로컬변수의 사용제한 (0) | 2023.04.11 |
---|---|
이것이 자바다 Reflection - newInstance() 및 ArgumentsConstrouctor 객체 생성법 (0) | 2023.04.11 |
자바(JAVA) 예외(Exception) Checked Exception과 UnChecked Exception (0) | 2023.04.10 |
자바 Object 클래스 객체복제 (얇은복제) (0) | 2023.04.10 |
JAVA Generic 제네릭 (2) / 제한된 타입 파라미터, 와일드카드 타입, 제네릭 타입의 상속과 구현 (0) | 2023.03.12 |