
https://github.com/WonGi-Kim/sparta_calculator_level1.git
이걸 만들고 나서 다음 레벨로 넘어가려 했는데..
다음 레벨의 요구사항 첫 번째 부터 예외처리 때문에 진도를 나아가는데 차질이 생겼다.
새로운 클래스를 만들어서 거기서 연산하고, 결과를 컬렉션에 지정해서 넣고, 값도 반환하는 요구사항도 있었지만 3주차 공부 내용에 조금은 나오니까 크게 어렵지 않았다..
그렇지만 예외처리는 어떤 언어에서도 해본적이 없어서 예외 클래스를 생성하고 예외처리 해본건 처음이었다.
} else if (operator.equals("/")) { if (secondNumber == 0) { // Exception throw new DivisionByZeroException("분모에 0이 들어올 수 없습니다."); } result = firstNumber / secondNumber; System.out.println("결과는 : " + result); } else { throw new InvalidOperatorException("잘못된 연산자 입니다.");
여튼 계산을 담당하는 클래스 내부에서 위의 코드와 같이 예외처리를 진행했는데 DivisionByZero라거나 InvalidOperator처럼 예외처리 목록이 이미 존재하는 줄 알았다.
예를 들면 IllegalArgumentException이나 ArithmeticException 처럼 말이다.
(위의 두 예외는 예외 클래스를 어떻게 작성하는지 찾아보다 알게되었다.)
심지어 ArithmeticException 예외는 커스텀 예외인 DivisionByZero 와 똑같은 역할이다.
그렇다면 왜 굳이 상황에 적합한 예외처리를 따로 만들어서 던져주는걸까?
나는 대충 두가지가 생각 났고 검색하며 찾은 결과도 엇비슷했다.
- 코드의 가독성 증가
- 예외가 발생한 상황을 정확하고 구체적으로 설명 가능
-> 예외 처리를 더 효과적으로 가능

이렇게 두 번째 숫자에 0을 넣으면 
꽤나 직관적으로 오류내용을 던져준다.
내가 사용자 정의 예외 클래스를 저장한 방식은
public class InvalidOperatorException extends Exception{ public InvalidOperatorException(String message) { super(message); } }
처럼 새로운 클래스를 하나 만들었고
public int calculate(String operator, int firstNumber, int secondNumber) throws DivisionByZeroException, InvalidOperatorException{
처럼 Calculator 클래스의 메서드에 throws를 해줬다.
그리고 마지막으로 main에서 Calculator의 메서드를 호출하기 때문에
throw는 main에서 사용한다.
try { calculator.calculate(operand,a,b); } catch (DivisionByZeroException e) { throw new RuntimeException(e); } catch (InvalidOperatorException e) { throw new RuntimeException(e); }
일단 일반적인 상황이 아닌 내 코드에서의 예외처리 부분만 이해하려고 노력했기에 내 코드를 기준으로 기술했다.
- main의 try ~ catch 내부에서 calculate 메서드 호출
- calculate 메서드 내에서 예외로 처리를 위한 로직이 실행되면 사용자 정의 예외가 발생
- 예외가 발생하면 calculate 메서드는 즉시 종료되고 예외가 발생한 곳으로 이동
- 처음 calculate 메서드를 호출한 곳이 try이기 때문에 try를 빠져나와 catch로 이동
- catch블록에서 발생하는 예외의 타입에 따라 처리 수행 여기서는 '런타임 예외' 이므로 런타임예외로 감싸 throw한다.
사실 글로만 계속 보니까 이해 안되는데 옆에 코드 띄워놓고 천천히 따라가면 흐름정도는 보이는 수준은 된거 같다.
(몇 번 더 보면 익숙해지겠지)
단어만 봐도 대충 던지는건 잘 알겠는데 왜 다른지 부터 찾아봤다.
- throw : 에러를 고의로 발생시킬 때 사용
- throws : 자신을 호출한 상위 메서드로 에러를 던지는 역할
후기 1. 아직 제네릭도 남았고, 쓰레드, 람다... 꽤 많네...