본문 바로가기

프로그래밍 언어(Programming Language)/Java

[Java] Try catch 그리고 finally!?

 Java의 문법을 공부하다보면 종종 헛갈리는 부분들이 있다. try catch finally문은 자주 헛갈리는 종류 중 하나이다. 

  1. Try문을 실행한다. 
  2. Catch문을 실행한다.
  3. Finally문을 실행한다.

이 구문은 몇 가지의 실행 가능한 경우의 수를 갖는다.

  • 1을 실행하던 도중 에러 발생한다. 2를 실행한다. 그리고 3을 실행한다.
  • 1을 에러 없이 실행한다. 그리고 3을 실행한다.
  // Background : 하나의 인스턴스에 대한 공유자원인 String형 newString과 boolean형 isNewString을 이용하여 문자열을 읽고 쓴다.
  // String newString : 새로운 문자열을 저장한다.
  // boolean isNewString : Writer 인스턴스에 의해 읽혔으면 true. 그렇지 않으면, false 이다.

  public void setNewString(String news)
  // Description : 새로운 문자열을 기록한다. 
  {
      entLock.lock(); // 동기화를 처리하기 위하여 lock()을 이용한다.
      try {
          if(isNewString==true)   // 문자열이 읽혔는 지 확인한다. 읽히기 않았으면 기다린다.
              writeCond.await();

          newString = news;
          isNewString = true;
          readCond.signal();

      } catch (Exception e) {
          //TODO: handle exception
          e.printStackTrace(); 
      }
      finally
      {
          entLock.unlock();   // 동기화를 위해 unlock()한다. 
      }
  }

setNewString은 문자열을 저장하는 메소드이다. 이 코드의 특징은 문자열이 Writer(예시 코드에는 나와있지 않다.)에 의해 읽히지 않았다면 isNewString==true 가 참이라는 것이다. 이 메소드가 처음으로 실행되면 try문으로 넘어가면서 lock() 메소드가 실행된다. 처음으로 실행되는 메소드라는 가정하에 newString에 news를 저장한다. 예외가 발생하지 않았으므로 finally문으로 넘어가서 unlock()을 수행한다(unlock()은 다른 메소드가 동시에 실행하면 안되는 코드에 접근할 수 있도록 한다).