1. 개요
프로젝트를 진행하면서 예외처리를 하지 않으면 예상치 못한 오류가 많이 일어나게 됩니다. 이번 계산기 프로젝트를 진행하면서 작성했던 예외처리 과정을 정리해볼 것입니다.
2. 배경
lv2 계산기 프로젝트를 구현하던 상황이었습니다.사용자 입력, 사칙연산, 출력이 모두 메인 메소드에서 이루어지던 lv1 코드를 가져와서 사칙연산 기능만 calculator 클래스로 옮겨서 개발 중이었습니다.
3. 발단
lv2 계산기 프로젝트의 사칙연산 기능을 테스트해보던 도중 두번째 숫자가 0일때 나눗셈 연산을 하는 경우 infinity로 담기는 것을 발견했습니다. 또한 사칙연산 기호를 제대로 입력하지 않은 경우 에러가 나서 종료되는 것을 볼 수 있었습니다.
3. 전개
lv1에서는 하나의 클래스에서 0으로 나눌 경우 while문을 통해 다시 처음부터 입력하도록 할 수 있었는데 lv2에서는 사칙연산 코드를 calculator클래스로 따로 뺐기 때문에 continue를 적어줄 수 없어서 관련 해결 코드를 작성해두지 않았던 상태였습니다. 또한calculator 클래스의 사칙연산을 switch-case문으로 구현하고 default문에 사칙연산을 제대로 입력하지 않은 경우 경고문을 출력하고 다시 continue하도록 처리해뒀는데 operate를 입력받을 때 바로 에러가 나는 것이기 때문에 switch-case문이 작동하지도 않고 에러가 나는 것을 확인할 수 있었습니다.
4. 위기
0으로 나눌 경우에 대해 throw new ArithmeticException을 추가하고 잘못된 연산자일 경우 throw new IllegalArgumentException을 추가했지만 이번에는 예외가 발생할 경우 프로그램이 즉시 종료되었습니다. 어떤 종류의 오류가 발생한 것인지는 알 수 있게 되었지만 오류 발생시 프로그램 종료가 아닌 연산 과정을 다시 할 수 있도록 구현하고 싶었습니다.
5. 절정
이 문제를 해결하기 위해 메인 메서드에서 예외를 처리할 수 있도록 try-catch 블록을 추가했습니다. 연산자를 잘못 입력받을 때부터 오류가 날 수 있으니 연산자를 입력받는 부분부터 try로 감싸고 Calculator 클래스의 연산기능을 해서 결과를 출력할 때까지의 에러를 catch문에서 확인하고 에러시 continue를 통해 다시 연산을 진행하도록 구현했습니다.
6. 결말 및 프로젝트를 하며 느낀 점
수정 후 프로그램이 모든 예외상황을 적절히 처리하며 안정적으로 동작하는 것을 확인했습니다. 잘못된 입력이 들어와도 명확한 오류 메시지를 출력하고 사용자로부터 입력을 다시 받을 수 있도록 구현했습니다. 이번 프로젝트의 예외처리 과정을 통해 더 안전하고 예외 발생 시 프로그램이 종료되지 않도록 설계하는 방법에 대해 많은 것을 배울 수 있었습니다.
또한 프로젝트를 제출한 후 다른 팀원들의 깃허브에서 코드들을 살펴봤는데 이렇게 할 수 있었구나, 내가 한 코드는 아직 많이 미흡했구나 라는 것을 느꼈고 공부를 많이 하고 구글링도 꽤 했다고 생각했는데 완벽하게 개념들을 이해하지 못하고 사용한 것 같아서 아쉬움이 남습니다. 피드백을 받고 더욱 더 좋은 코드를 완성하고 싶습니다.
수정 전 코드
Calculator.java
switch (operator) {
case '+':
result = first + second;
break;
case '-':
result = first - second;
break;
case 'x':
result = first * second;
break;
case '%':
if (second == 0) { //예외: 나눗셈 연산에서 분모가 0인 경우
System.out.println("분모(두번째 정수)에 0이 입력된 경우 나눗셈 연산이 불가합니다. 다시 입력해주세요.");
continue;
}
result = first / (double) second;
break;
default: //예외: 기호가 일치하지 않는 경우
System.out.println("유효하지 않은 연산 기호입니다. 다시 입력해주세요.");
continue;
}
App.java
//사칙 연산 기호 입력받기
double result = 0;
System.out.print("사칙연산 기호를 입력하세요(ex:+,-,x,%): ");
char operator = sc.next().charAt(0);
수정한 코드
Calculator.java
switch (operator) {
case '+':
result = first + second;
break;
case '-':
result = first - second;
break;
case 'x':
result = first * second;
break;
case '%':
if (second == 0) { //예외: 나눗셈 연산에서 분모가 0인 경우
throw new ArithmeticException("분모(두번째 정수)에 0이 입력된 경우 나눗셈 연산이 불가합니다.");
}
result = first / (double) second;
break;
default: //예외: 기호가 일치하지 않는 경우
throw new IllegalArgumentException("유효하지 않은 연산 기호입니다.");
}
App.java
//사칙 연산 기호 입력받기
System.out.print("사칙연산 기호를 입력하세요(ex:+,-,x,%): ");
try {
char operator = sc.next().charAt(0);
double result = calculator.calculate(first, second, operator);
System.out.println("결과: " + result);
} catch (Exception e) {
System.out.println("오류: " + e.getMessage());
continue; // 잘못된 입력이 있으면 다시 입력받기
}
'프로젝트 > 계산기' 카테고리의 다른 글
[계산기 프로젝트] 스트림 (0) | 2025.01.09 |
---|---|
[계산기 프로젝트] enum, 람다, BiFunction (0) | 2025.01.07 |