본문 바로가기

Java

JAVA :: exception :: return 문이 있는 try, catch, finally

try ~ catch 문은 예외(exception) 처리를 해줘서, 원하는 결과가 아닌 예외적인 상황(대부분 에러)이 발생했을 때 이를 처리할 수 있도록 해 준다.


try ~ catch 문에서 finally 는 예외가 발생하던 하지 않던 반드시 처리해줘야 하는 부분을 기술할 때 쓰인다. 예를 들어 네트워크에서 커넥션(connection) 을 받아왔다가 닫아줘야 하는 경우 connection.close() 를  finally 문 내에 선언해 줌으로써 예외가 발생하던 하지 않던 간에 열어줬던 커넥션을 꼭 닫아주도록 한다. (커넥션이라 함은, 네트워크 상에서 원거리에 있는 다른 프로세스와 통신을 하기 전에 먼저 나와 연결되도록 해야하는데, 그렇게 해서 연결된 그 연결을 connection 이라고 한다. 그러므로, 커넥션을 열어주고, 할 일이 끝나면 커넥션을 닫아준다는 식으로 표현되는 것이다.)


자, 그럼 과연 try ~ catch 문 안에서 리턴문이 있으면 어떻게 될까?? 간단한 것이므로 실험을 해봤다 아래는 소스코드.



public class TestJava {

    public boolean test(int i){

        try {

              System.out.println("i : " + i);

              if(i == 1)

                     throw new Exception();

              return true;

             }

        catch (Exception e) {

              System.out.println("exception");

                    return false;

             }

             finally{

                    System.out.println("finally");

             }

    }

 

    public static void main(String args[]) throws InterruptedException {

        TestJava java = new TestJava();

        java.test(0);

        System.out.println("==========================================");

        java.test(1);

    }

}



보는 바와 같이 test(int i) 메소드 안에서 전달되는 i 의 값을 출력 시킨 후, i 의 값에 따라 1이면 익셉션을 발생시켜 주고, 1이 아닐 경우 true 를 바로 리턴한다. 그리고 익셉션이 발생한 경우 catch 문에서 익셉션을 잡아서 "exception" 이라고 출력한 뒤, false 를 리턴한다. 리턴한 뒤에도 finally 문이 실행되는지 확인해보기 위해 finally 문 안에서 "finally" 가 출력되도록 하였다. 그리고 실행 해본 결과는 아래와 같다.




return 에 상관없이 finally 문이 실행되는 것을 알 수 있다.


결론은

finally 문 내부에 있는 내용은 익셉션이 발생하든 하지 않든, 리턴문이 있던 없던 무조건 무조건 실행된다.