본문 바로가기
IT(Dev) Notes

예외처리

by 미티치 2016. 10. 13.

예외처리 (또는 오류 처리)란, 일반적인 실행의 흐름을 바꾸는 몇 가지 조건을 처리하도록 설계한 프로그래밍 언어의 개념이나 컴퓨터 하드웨어 구조를 의미한다.


코딩을 할 때, 사실 예외처리를 많이 하지 사용해본적이 없다. 그나마 예외처리의 필요성을 느꼈던 적이 프로젝트 진행하면서 정말 말 그대로 생각치 못했던 '예외'를 만났을 때, 그리고 웹을 하면서 조금 예외처리의 필요성을 느꼈던 것이 전부였다.


나처럼 학생의 입장에서 예외처리는 사실 많이 중요하지 않았다. 그치만 실무에서 예를들어 전투기, 원자력 발전소 같은 민감한 분야에서는 프로그램이 죽거나하면 정말 정말 큰 사고로 이어질 수 있기 때문에 예외처리는 사실 엄청 중요한 것!!



예외처리를 생각하면 가장 먼저 떠오르는 예시가 NumberFormatException이다. (Java에서 제공하는 예외처리 클래스)

자바에서 사용자에게 정수를 입력받아 나누기를 하는 코드를 작성하다고 생각해보자.  ( 생각나는대로 적은 예시라 문법이 완벽하지 않을 수 있음 )


Scanner scanner = new Scanner(System.in); 

int num1 = 10;

int num2 = scanner.nextInt();


System.out.println(num1/num2);


이렇게 출력한다고 하면, 예를들어 사용자가 2를 입력하면  5가 출력될 것이고 4를 입력하면 2가 출력될 것이다.

하지만 프로그램을 사용자가 프로그램을 어떻게 사용할지 모든 상황을 예측할 수 있는 것이 아니다. 그 예로, 사용자가 만약 0을 입력한다면?


10/0은 Exception in thread "main" java.lang.ArithmeticException: / by zero 이라는 에러를 내면서 프로그램을 비정상적으로 종료시킨다. 

System.out.println(10/2);

System.out.println("값 : "+10/0);

System.out.println(10/4);


위 코드에서 제일 첫 줄의 5는 연산해서 출력하지만, 에러를 발생시키는 두번째 줄에서 프로그램이 종료되면서 마지막 줄을 연산해서 출력하지 않는다. 즉, 프로그램이 비정상적으로 종료된 것을 의미한다.




예외처리가 없는 시절에는 Defensive Programming을 했었다. 이는 위의 예시처럼 if문을 많이 사용해서 예외를 처리해주는 것을 의미한다.


하지만 라이브러리의 함수같은 경우는 예외에 대한 if문이 내부적으로 있어도 이에 대한 처리를 사용자가 정의하지 못한다. ( 사용자가 정의하기 위해서는 반환형으로 예외 코드를 줘야하겠지 )


double sqrt(double x) {

     if (x<0) {

          // 예외 처리

     }

}


위의 코드가 라이브러리의 코드이면, 코드가 예외확인과 처리 2가지를 다 한다.



여기서 예외처리부를 사용자가 할 수 있도록 한게 바로 예외처리. 즉, Exception이다.


double sqrt(double x) {

     if (x<0) {

          throws new X();

     }

}



try {


} catch (X *e) {


}



'IT(Dev) Notes' 카테고리의 다른 글

Apache Kafka  (0) 2022.09.14
[요약] 데이터 3법 개정안  (0) 2021.08.20
C++ 개발자를 위한 Visual Studio 설치하는 방법  (0) 2020.08.08
객체의 필드에 직접 접근하면 안되는 이유  (0) 2017.03.24
HASH 함수  (0) 2017.03.16