개발을 하다보면 가장 자주 보게되는 콘솔 로그는 오류 또는 예외로 인한 로그입니다. 하지만 막상 누군가 에러와 예외에 관해 차이점을 묻는 다면 선뜻 대답하기가 어려운 것 또한 사실입니다. 그래서 에러와 예외를 잘 정리해서 누가 물어도 대답할 수 있도록 해당 부분에 대해 포스팅해보고자 합니다.
에러(Error)
에러란 무엇일까?
프로그램 실행 중 오작동을 일으키거나 비정상적인 종료가 일어나게 하는 원인
즉 에러는 개발자가 미리 예측하지 못한 곳에서 발생하기 때문에 개발자는 이를 방지할 수 없습니다. 또한 에러가 발생하는 원인을 살펴보면 내부적으로 프로그램 설계에 문제가 있어서 에러(논리적 에러) 가 발생하기도 하며 외부적으로는 하드웨어에서 문제가 생겨 오류가 발생해 프로그램이 종료될 수도 있습니다.
에러의 종류는 어떤 것이 있을까?
발생 시점에 따라 에러를 구분한다면 총 3가지로 분류할 수 있습니다.
1. 컴파일 에러
2. 런타임 에러
3. 논리적 에러
컴파일 에러
- 컴파일러가 소스 파일을 컴파일 하는 시점에서 나타는 수 있는 에러 (EX : 문법 에러 - 오타 혹은 잘못된 구문, 자료형 체크)
- 프로그램이 실행되기 전에 알 수 있기 때문에 개발자 입장에서 가장 쉽게 해결할 수 있습니다.(컴파일 에러시 프로그램 자체가 실행이 안되요...)
- IDE를 통해서 쉽게 알 수 있습니다.
런타임 에러
- 컴파일이 끝나고 프로그램을 실행하는 도중 개발자가 의도하지 않은 결과를 얻게하거나 하드웨어의 결함으로 프로그램이 비정상적으로 종료시키는 에러가 런타임 에러입니다.
- 대체적으로 설계를 잘못했을 때 자주 발생하는 에러로 디버깅 로그를 통해서 개발자는 에러가 난 지점을 역추적해서 원인을 파악하고 수정해야합니다.
- 런타임 에러를 줄이기 위해서는 개발자는 프로그램이 실행될 수 있는 여러 경우를 고려해서 개발을 해내가야합니다.
논리적 에러
- 프로그램이 실행하고 작동하는 데에 아무런 문제를 발생시키지 않는 에러이지만 사용자가 기대한 결과를 얻지 못하게 하여 서비스 이용을 어렵게 만들 수 있습니다.
- 쇼핑몰에서 장바구니에 담은 상품 총 가격이 마이너스로 나오거나 내 ID와 PW를 사용해 로그인했지만 다른 사람 계정으로 로그인 되는 경우가 논리적 에러에서 속합니다.
- 해당 오류는 에러 로그를 보여주지 않기 때문에 개발자는 오류를 수정하기 위해 알고리즘을 정확히 분석해야합니다.
에러(Error) VS 예외(Exception)
위 글에서 에러에 관해 대략적인 개념이나 케이스를 살펴보았지만 아직까지도 예외나 에러가 무엇이 다른지 알 수 없기 때문에 자바에서 구현해놓은 클래스를 통해 이를 비교해보겠습니다.
자바에서 발생하는 예외 클래스를 살펴보면 크게 Throwable 클래스를 상속받는 Error 클래스와 Exception클래스로 구분하여 사용하고 있습니다.
- Error 클래스를 상속받는 클래스 : OutOfMemoryError, StackOverflowError
- Exception 클래스를 상속받는 클래스 : IOException, RuntimeException
해당 Error클래스를 상속받는 클래스들을 살펴보면 OutOfMemoryError, StackOverflowError 클래스 모두 JVM 실행에 문제를 발생시키기 때문에 개발자가 수동으로 대처할 수 있는 방법이 없습니다. 하지만 NullPointerException과 같은 문제들은 개발자가 대응 코드를 통해 충분히 예외를 처리하여 비정상적인 종료를 미리 방지할 수 있습니다.
위 개념들을 통해 에러(Error) 와 예외(Exception)의 차이점을 살펴 보자면
에러(Error)는 개발자가 미리 방지하거나 예상할 수 있는 범위를 벗어난 오류를 말하며 일단 발생하면 프로그램이 종료되는 심각한 오류라고 정의할 수 있으며 예외(Exception)는 개발자가 충분히 예견할 수 있고 발생하더라도 수습할 수 있는 작은 오류이며 에러(Error)처럼 프로그램이 완적히 죽는 경우는 매우 드뭅니다. 나중에 예외로 인해 프로그램이 종료되는 일이 없도록 처리할 수 있게 해주는 try ~ catch 문이나 try ~ with ~ resource 구문을 이용한 예외처리하는 방법에 대해서도 공부해서 포스팅해보도록 하겠습니다.
'공부방 > Java' 카테고리의 다른 글
Try-with-resources 문을 이용한 예외 처리 (0) | 2023.01.25 |
---|