티스토리 뷰

포스팅에 앞서 내용이 틀릴 수 있습니다.
해당 부분 지적 감사히 받습니다.

 

자바에서 프로그램 로직을 짜다가 만약 문제가 생기면 어떻게 될까?

 

문제의 종류에 따라 다르겠지만, 자바는 이럴 때 오류를 내뱉으며 즉시 프로그램을 종료한다.

 

물론 자바뿐만 아니라 다른 프로그래밍 언어들 또한 그렇다.

 

자바에서는 예외처리를 통해 해당 프로그램의 오류 흐름에서 다시 정상 흐름으로 바꿀 수 있게 해 준다.

 

이 과정을 예외처리라고 한다.

 

또한.. 예외처리를 함으로써, 개발자가 코드를 읽을 때, 정상 흐름과 오류 흐름을 나눠 볼 수 있음으로, 가독성 또한 챙겨갈 수 있다.

 

일단 예외처리에 사용되는 키워드를 알아보자.

 

try : try뒤에 중괄호가 나오며, 이 지역에서 발생하는 예외를 탐색한다.

catch : try 지역 끝에 바로 나오며, try 동안 발생하는 예외처리를 잡는다.

finally : 예외처리가 있든 없든, try 지역이 끝나면 반드시 실행된다.

throw : try 지역 안에서 쓰이며 예외를 발생시킨다.

throws : try 안에서 잡힌 예외를 특정 객체 타입으로 외부로 던진다.

 

 

그리고 이렇게 쓴다.

try{ // 1
    로직(); // 2
}catch(예외종류 e){ //7
        잡힌 예외 처리해서 정상 흐름으로 바꾸기 // 6
}
finally{
    이건 꼭 실행해야 겠다 싶은거 //9
}


public void 로직() throws Exception //6{

    정상 로직중 // 3

    if(문제 발생){ // 4
        throw 예외 발생 // 5
    }
}

실행 순서대로 주석을 달아놨다.

 

여기서 6번에 대해서 좀 알고 넘어가야 하는데, 6번은 Exception을 밖으로 던질 때, 예외의 반환 타입에 대해 결정하는 것이다.

 

즉 어떤 오류가 발생해도 Exception 타입에 담아서 던지겠다는 것이다. 

 

자 여기까지 설명을 들었으면 떠올라야 하는 의심이 하나 있다.

 

그렇다 예외도 객체이다.

 

그리고 어떤 예외든 Exception에 담긴다.(예외들의 부모)

 

예외도 종류가 많은데.. 잘 찾아보길 바란다  ㅎㅎ

 

또 자바에서 오류는 Error와 Exception이 있는데 error는 잡을 필요가 없다.

 

왜냐면 잡아도 개발자가 할 수 있는 게 없기 때문이다.

 

메모리가 부족하거나 심각한 시스템 오류가 발생한걸 개발자는 어찌할 수 없기 때문이다.

 

이제 예외처리의 기본 규칙 2가지에 대해 알아보자.

 

1. 예외를 잡아 처리한다.

2. 예외를 밖으로 던진다.

 

이 둘 중 하나를 선택해서 개발하면 된다.

 

던진다는 건 예외가 발생한 부분을 호출했던 (메서드) 곳으로 던진다는 것이다.

 

하지만 예외를 처리하지 않고 계속 던지면 결국 main 메서드에까지 가게 되는데, 여기에서도 처리 안 하고 던지면?

 

프로그램 꺼진다. 즉 언젠가는 예외처리를 해줘야 한다.

 

Object -> Throwable -> Exception -> checkException   (체크 예외)

                                                      ㄴ RuntimeException (언체크 예외)

 

예외의 계층은 위와 같이 이루어져 있다.

 

체크 예외, 언체크 예외로 나뉘며, 이 둘의 차이점은 개발자가 체크 예외를 발생시켜 놓고 이를 잡아 처리하는 로직을 만들지 않으면, 컴파일 단에서 오류를 내준다.

 

즉 개발자가 미구현하는 예외처리가 없게끔 해준다.

 

언체크 예외는 자바 컴파일러가 예외처리가 안되어 있어도 체크하지 않는다.

 

이 두 설명만 들으면 당연히 체크 예외를 쓰는 게 프로그램 안정성이 더 있지 않을까 하고 생각이 드는 게 당연하다.

 

하지만 실무에서는 언체크 예외를 더 많이 사용한다.

 

왜냐하면 체크 예외는 발생할 수 있는 모든 예외에 대해 각자 따로 처리해줘야 하는데, 이 과정이 번거롭기 때문이다.

 

또한 RuntimeException은 애초에 프로그램이 돌아가면서 예상치 못하게 발생할 수 있는 부분이라, 자바가 컴파일단에서 잡아낼 수도 없다. (ex) DB값 조회해 오는 데 있을지 없을지 모른다.)

 

자 RuntimeException은 위 코드에서 나온 6번이 필요 없다.

 

왜냐하면 자바가 체크 안 할 거니까 그냥 자동으로 예외가 생기면 던져준다.

 

기본적으로 생략하는 게 맞고, 해당 예외가 너무 중요하면 써넣어도 상관은 없다.

 

그러면 RuntimeException(언체크) 예외의 장단점은 무엇일까?

 

장점 : 신경 쓰고 싶지 않은 예외를 무시할 수 있다.

단점 : 실수로 예외처리를 누락할 수도 있다.

 

체크 예제와 언체크 예제는 서로의 장단점이 완전히 반대로 겹친다.

 

finally는 예외가 발생해도, 발생 안 해도 결국엔 실행된다.

 

왜 필요하냐면, DB에 연결하는 로직을 만들었을 때, 중간에 예외가 발생하면 프로그램이 그 즉시 중단이 되어버린다.

 

따라서 finally 지역에 DB연결을 해제하는 코드를 넣어 서버 연결을 확정적으로 종료시킬 수 있다.

 

예외처리는 이 정도만 알아도 될듯하다.

 

추가적으로 try with resource 만 알아보자.

 

이는 앞서 설명한 DB연결과 해제에 관련해서 더 확실하게 해 준다.

 

이를 사용하기 위해선 AutoCloseable 인터페이스를 구현해야 한다.

public interface AutoCloseable{
    void close() throws Exception;
}

 

그리고

try (Resource r = new Resource()){ }

기존 try에 소괄호를 넣고 아래와 같이 사용하면, try 가 끝날 때 자동으로 close() 메서드가 호출이 된다.

 

finally가 있는데 귀찮게 인터페이스 생성하고 이걸 왜 써야 하나 의문이 들 수도 있다.

 

try with resource의 장점은

- 리소스 누수방지

- 코드 간결성 (가독성 향상)

- 스코프 범위 한정

- 조금 더 빠른 자원 해제

 

등이 장점으로 있기 때문이다.

 

끝!

 

댓글