📝느낀 점
나는 백엔드 개발자를 한다면 정말 중요하게 생각드는 부분이라고 생각든다.
하지만, 매번 까먹고 다시 공부하고 하면서 문제의 심각성을 알게 되었다. "왜, 매번 까먹지?" 내가 생각한 결론은
한번도 예외처리에 대해 글로만 공부하고 직접 사용해보지 않아서 인것 같다. 물론, 사람들마다 다르겠지만,
나란 사람은 직접 코드로 작성해보고 "이건 이렇게 되는구나 실행해보고" 하면서 머리에 자리 잡혀 또 이렇게
부족한 나의 포스팅들이지만 계속 수정해 가며 살을 붙일 수 있는 블로그인이 될수 있도록 하겠다.
체크 예외 같은 경우, 개발자가 실수로 예외를 까먹지 않도록 컴파일 시점에 문제를 잡아주는 안전 장치라고
생각 할수 있다. 언체크 예외 같은 경우 컴파일러가 체크 하지 않는 언체크 예외이다.
"체크를 왜 하지 않아? 그러면 안좋은거 아냐?" 생각이 들수도 있지만 이유는 하나하나 신경쓰고 싶지 않을 경우
언체크 예외를 통해 생략할 수 있기 때문이다.
Error와 Exception의 차이
Error는 실행 중 일어날 수 있는 치명적 오류를 말한다. 컴파일 시점에 체크할 수 없고,
오류가 발생하면 프로그램은 비정상 종료되며 예측 불가능한 UncheckedException에 속한다.
반면, Exception은 Error보다 비교적 경미한 오류이며, try-catch를 이용해 프로그램의 비정상 종료를 막을 수 있다.
Error(=오류)
시스템이 종료되어야 할 수준의 상황이며 수습할 수 없는 심각한 문제를 의미한다. (=개발자가 미리 예측할 수 없는것)
Error도 "언체크 예외"이다
Exception(=예외)
개발자가 구현한 로직에서 발생한 실수나 사용자의 영향에 의해 발생한다.
오류와 달리 개발자가 미리 예측하여 방지할 수 있기에 상황에 맞는 예외처리를 해야한다.
Error(=오류)에 대해서
개발자가 미리 오류를 대처하기는 힘든 오류이다.
개발자는 이 예외를 잡으려고 해서는 안된다.
- StackOverflowError
- 호출의 깊이가 깊어지거나 재귀가 지속되어 stack overflow 발생 시 던져지는 오류이다.
- OutOfMemoryError
- JVM이 할당된 메모리의 부족으로 더 이상 객체를 할당할 수 없을 때 던져지는 오류이다.
메모리 부족이나 심각한 시스템 오류와 같이 애플리케이션에서 복구 불가능한 시스템 예외이다.
Exception(=예외)에 대해서
Exception 과 그 하위 예외는 모두 컴파일러가 체크하는 체크 예외이다.
단 "RuntimeException"은 예외로 한다.
- NullPointerException
- 객체가 필요한 경우인데, 프로그램이 null을 사용하려고 시도할 경우 던져지는 예외이다.
- IllegalArgumentException
- 부적절한 argument를 받았을 경우에 던져지는 예외이다.
하지만 Exception은 "던질 수 있는" 예외이기도 하다.
프로그램의 로직이 진행되다가 개발자가 임의로 예외를 던질 수 있다는 의미가 된다.
웹 애플리케이션의 경우 여러 사용자의 요청을 처리하기 때문에 하나의 예외 때문에 시스템이 종료되면 안된다.
WAS가 해당 예외를 받아서 처리하는데, 주로 사용자에게 개발자가 지정한, 오류 페이지를 보여준다.
Checked Exception, Unchecked Exception 설명
Checked Exception
Exception 을 상속 받으면 체크 예외 이다.
체크 예외는 예외를 잡아서 "처리하거나", "던지거나" 둘중 하나이다.
체크 예외는 예외를 잡아서 처리할 수 없을 때, 예외를 밖으로 던지는 throws 예외를 필수로 선언해야 한다.
그렇지 않으면 컴파일 오류가 발생한다.
체크 예외의 장점
개발자가 실수로 예외를 누락하지 않도록 컴파일러를 통해 문제를 잡아주는 안전 장치이다.
체크 예외의 단점
실제로는 개발자가 모든 체크 예외를 반드시 잡거나 던지도록 처리해야 하기 때문에, 너무 번거로운 일이 된다.
- 크게 신경쓰고 싶지 않은 예외까지 모두 챙겨야 한다.
Unchecked Exception
RuntimeException 을 상속받으면 언체크 예외가 된다.
RuntimeException: 언체크 예외, 런타임 예외
- 컴파일러가 체크 하지 않는 언체크 예외이다.
- RuntimeException 의 이름을 따라서 그 하위 언체크 예외를 런타임 예외라고 많이 부른다.
언체크 예외 설명
- 언체크 예외는 말 그대로 컴파일러가 예외를 체크하지 않는다는 뜻이다.
- 언체크 예외는 예외를 잡아서 처리할 수 없을 때, 예외를 밖으로 던지는 throws 예외를 생략할 수 있다.
언체크 예외의 장점
- 신경쓰고 싶지 않은 언체크 예외를 무시할 수 있다.
- 신경쓰고 싶지 않은 예외의 의존관계를 참조하지 않아도 되는 장점이 있다.
언체크 예외의 단점
- 언체크 예외는 개발자가 실수로 예외를 누락할 수 있다.
- 반면에 체크 예외는 컴파일러를 통해 예외 누락을 잡아준다.
체크, 언체크 정리
체크 예외와 언체크 예외의 차이는 예외를 처리할 수 없을 때 예외를 밖으로 던지는 부분에 있다.
이 부분을 필수로 선언해야 하는가? 생략할 수 있는가? 의 차이다.
즉, 필요한 경우에는 예외를 잡아서 처리하며, 그렇지 않은 경우에는 자동으로 예외를 밖으로 던지면 되는 것이다.
Reference :
'Java' 카테고리의 다른 글
배열의 선언과 메모리 할당 (0) | 2023.11.07 |
---|---|
static primitive, static reference 저장 / static 메서드와 일반 메서드의 차이점 (0) | 2023.11.07 |
불변 객체나 final을 굳이 사용해야 하는 이유가 있나요? (0) | 2023.11.07 |
equals, hashCode 메서드는 왜 사용하나요? (0) | 2023.11.07 |
static에 대해 설명 / static을 사용하는 이유는? (0) | 2023.11.07 |