우아한 테크코스 2주차 프리코스 과제를 진행하던 도중 Car 클래스의 이름에 대한 검증을 어디서해야할지에 대한 고민을 하게 되었다.
원래는 ErrorManager라는 클래스를 만들어서 모든 예외사항들을 한 번에 관리하고 있었는데 이렇게 되면 클래스 간의 의존성이 하나 더 추가되어서 안 좋다는 생각을 하게 되었다.
public Car(String name){
ErrorManager.validateNameNull(name);
ErrorManager.validateNameLength(name);
this.name = name;
}
Car 클래스의 생성자
친구와 이 고민을 나눠봤는데 예외와 에러에 대한 차이와 Checked Exception과 Unchecked Exception에 대해서 알아보면 좋을 것 같다고 했다.
주어진 요구사항을 보고 코드를 짤 때 요구사항에 맞지 않으면 에러인지 에러인지 생각을 해보지 않았다. 생각을 해보지 않았다기 보다는 둘이 비슷한 결이라서 구분할 시도를 안했던 것 같다.
얘기를 듣고 생각해보게 되었는데 내가 생각하는 에러와 예외는 이렇다. 에러는 '언어 자체가 받아들이지 않는 것' 이고 예외는 '요구사항에 맞지 않는 것' 이라는 생각이 들었다.
직접 찾아보니 완전히 틀린말은 아니었다.
에러는 '시스템에 비정상적인 상황이 생겼을 때 발생하는 것' 이라고 한다. 시스템 레벨에서 발생하기 때문에 심각한 수준의 오류이고 개발자가 미리 예측하여 처리할 수 없다.
예외는 '개발자가 구현한 로직에서 발생한 실수나 사용자의 영향에 의해 발생하는 것' 이라고 한다. 에러와는 다르게 개발자가 예측하고 사전에 방지할 수 있기 때문에 상황에 맞게 처리해주어야 한다.
위에서 ErrorManager라는 클래스를 만들어서 관리했다고 했는데 요구사항과는 다르게 흘러가고 개발자인 내가 바꿀 수 있는 상황이기 때문에 에러가 아닌 예외인 것 같아 ExceptionManager라고 바꾸어야 할 것 같다.
예외와 에러의 차이를 알아봤으니 이제 예외의 종류인 Checked Exception과 UncheckedException에 대해서 알아보자.

RuntimeException을 상속하지 않는 클래스RuntimeException을 상속하는 클래스위의 사진을 보면 Object 클래스 아래에 Throwable 클래스가 있고 Error과 Exception 클래스로 나뉜다. 노란색으로 표시된 것들이 Checked이고 초록색은 Unchecked이다.
Checked에 속해 있는 IOException은 BufferReader를 통해 입력을 받을 때 많이 본 예외이다.
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
throws IOException 을 해주지 않으면 readLine()에서 오류가 나고 파일이 아예 실행되지 않는다.
반면에 이번 미션에서 주어진 요구사항에 대한 예외들은 반드시 해야하는 것이 아닌 임의로 하는 것이기 때문에 Unchecked에 속한다. 예외 처리를 하지 않아도 코드는 돌아간다.
하지만 요구사항에서
사용자가 잘못된 값을 입력할 경우 IllegalArgumentException을 발생시킨 후 애플리케이션은 종료되어야 한다.라고 명시해주었기 때문에 예외 처리를 해주어야 한다.