4. 자동 리소스 닫기

자동리소스 닫기는 JAVA7버전부터 새로 추가된 기능으로 try-with-resource라고 합니다.
close()메서드를 일일히 호출하여 닫아줘야 했던 리소스 객체를 자동으로 닫아주는 기능으로 각종 입출력 스트림, 서버소켓, 각종채널의 close()메서드를 자동으로 호출해줍니다.
try 영역이 정상적으로 실행 완료 했거나 도중에 예외가 발생하게 되면 자동적으로 close() 메서드가 호출되며 try영역에서 예외가 발생하면 우선 close()메서드를 호출 한 후 catch영역이 실행 됩니다



기존 close 메서드를 직접 닫아주는 소스입니다.
try 영역에서 FileInputStream을 열고 finally에서 스트림이 열려있는지 확인 한 후 열려있으면 close해주는 소스입니다.
다음은 try-with-resource를 적용한 소스입니다.



자동리소스 닫기 기능을 사용한 소스입니다. 위 소스에 비해 굉장히 간결한 느낌이네요.
try 옆 괄호()안에서 객체를 선언합니다. 이때 괄호에 들어올 수 있는 객체는 AutoCloseable 인터페이스를 상속한 객체들만 선언할 수 있습니다.
이 AutoCloseable 인터페이스가 자동으로 리소스의 close() 메서드를 호출해 주는데요 AutoCloseable 인터페이스 내부를 살펴 보면



close() 매서드만 명시되어 있습니다.

자, 그럼 실제로 close() 메서드를 호출해 주는데 AutoCloseable인터페이스를 구현한 클래스를 만들어서 테스트 해보겠습니다.



AutoCloseable을 상속한 FileStream1이라는 클래스를 만들어 close() 메서드를 오버라이드하여 구현했습니다.
try 옆 괄호에 FileStream 객체를 생성 한 후 try영역에서  FileStream 객체를 콘솔에 출력 후 try - catch문이 종료됩니다.
결과는 위와 같이 try - catch문이 종료 된 후 close() 메서드가 실행 되어 "FileStream1 close 호출" 문구를 출력했습니다.



이 소스는 위와 동일한 소스이나 try 영역 마지막에 강제로 예외를 만들었습니다.
결과는 보시는바와 같이 예외처리를 하기 전 close() 메서드를 호출 한 후 catch영역을 처리하는 모습을 볼 수 있습니다.



위 소스는 try 괄호 안에 AutoCloseable을 상속한 여러개의 객체들을 선언 할 수 있는 걸 보여줍니다.
FileSteam1, FileSteam2의 객체를 생성했으며 마찬가지로 각각의 close() 메서드를 호출하여 종료되는걸 볼 수 있습니다.



위 소스는  try 영역 안에다 객체를 생성한 모습입니다.
이런식으로 객체를 생성하면 close() 메소드가 호출 되지 않는 모습을 볼 수 있습니다.





5. 예외 떠넘기기(throws)

메서드 내부에서 예외가 발생했을 경우 try catch로 예외를 처리 할 수도 있지만 현재 메서드를 호출한 메서드로 예외처리를 떠넘길 수도 있습니다.
이런방법의 장점은 메서드 선언부를 통해 어떤 예외가 발생 할 것인가를 예측할 수 있고 또 이런 이유로 메서드를 사용하는 다른 개발자들에게 예외처리를 할 수 있는 기회를 제공하여 상황에 맞게 예외를 처리 할 수 있는 혜택(?)을 줄수 있습니다.


기본적인 예외 떠넘기기의 모습입니다.
throwsTest 메서드에서 String형 str을 인자로 받았는데 그 값이 null이네요.
그런데 str에 인스턴스 메서드를 호출하여 nullPointException이 발생합니다.
try catch문으로 예외를 처리 하지 않고 throws를 명시하여 예외를 호출한 메서드로 떠넘기고 있네요.


위에 소스를 실행했습니다.
throwsTest 메서드에서 발생한 예외를 method메서드로 떠넘겨 method메서드에 try catch문에서 예외를 분기처리 해주고있습니다.
throws 에는 여러 Exception을 명시 할 수 있습니다.
이미지에는 NullPointException, ArrayIndexOutBoundsException을 명시 했는데 만약 IOException이 발생하면 어떻게 처리 될까요?
처리과정은 동일하게 throwsTest메소드를 호출한 method메서드에서 예외 처리가 됩니다.
떠넘기는건 throws 키워드이며 옆에 Exception을 명시하는건 이 메서드는 이런 에러가 발생할 수 있다고 개발자에게 알리기 위한 용도입니다.

예외 떠넘기기를 정리 하자면 하나의 공통된 기능의 throwsTest메서드가 있는데 이 메서드에서 예외처리로 NullPointException이 발생했을 경우 "null은 허용할 수 없습니다." 라고 예외를 처리해 버렸을때, NullPointException이 발생하면 다른 값으로 치환해서 처리 하고 싶은 개발자가 있을것이고 아니면 null을 허용하고 싶어하는 개발자도 있을 것 입니다.
이러한 많은 상황에 대비하여 throwsTest메서드에서는 발생되는 예외는 무엇이며 이 예외는 니가 처리하라. 라고 선언해 주는 것 입니다.




1 댓글

댓글 쓰기

다음 이전