본문 바로가기
study_java/java_수강정리(~10.29)

[JAVA]18일차

by developer_j 2020. 6. 3.
728x90
반응형

< 18일차 수업 > 

 

 이때까지 우리가 배우면서 코드를 입력 했을 때, 잘못 코드를 짰거나 이상한 값을 입력한 경우 에러가 발생하면서 프로그램이 애초에 진행되지 않거나, 진행되다가도 잘못된 코드를 만나면 빨간 에러 문구가 출력되면서 프로그램이 종료되었다. 이처럼 자바 가상머신은 예외적인 상황을 처리할 때, 간단한 예외 정보를 출력하고 프로그램을 종료해버린다. 그런데 우리가 상용화된 어플을 쓸 때는 무언가를 잘못 입력할 경우 잘못 입력했다는 메시지만 떴지 어플은 종료되지 않는다. 왜 상용화된 어플은 값이 잘못 입력되었는데도 우리가 짜는 코드처럼 종료되지 않고 계속 실행을 유지했을까?

이것을 처리하는 것이 바로 오늘 배운 예외 처리이다.

0. 예외(Exception)와 오류(Error)

프로그램을 돌렸을 때 오작동이나 비정상적으로 종료되는 원인을 오류나 에러라고 한다. 이때까지는 에러가 발생하는 것에 대해 그냥 컴파일 에러, 에러 발생 등으로 지칭했었다. 그러나 이 오류 상황은 '예외'와 '에러'로 나뉘며,

에러는 '컴파일 에러'와 '런타임 에러'로 다시 나눌 수 있는데, 글자 그대로 컴파일 에러는 컴파일 시 발생하는 에러를, 런타임 에러는 프로그램 실행 도중에 발생하는 에러를 가리킨다. 이때까지 예제를 수행하면서 코드를 작성하자마자 나타나는 에러가 있었고, 처음에는 오류 발생 없이 실행되다가도 객체나 함수 호출 과정에서 에러가 발생하기도 했다. 이처럼 컴파일 에러가 없다고 해서 프로그램에 에러가 아예 없다는 뜻은 아니며, 실행 도중의 잠재적 오류까지 검사할 수 없기 때문에 실행 도중에 비정상적인 종료가 되기도 한다. 

보통 에러는 물리적인 오류나 메모리 부족, 스택오버플로우와 같이 발생하게 되면 복구할 수 없는 심각한 오류이고, 예외는 발생하더라도 개발자가 수습할 수 있을 정도의 비교적 덜 심각한 오류이다. 에러는 발생 시 막을 방도가 없지만, 예외는 프로그래머의 예외처리를 통해 비정상적인 종료를 막을 수 있는 것이다.

에러와 예외에도 클래스가 존재한다. 자바 Object 클래스를 상속하는 Throwable 클래스는 에러 클래스와 예외 클래스의 조상격 클래스로, throw는 예외를 '던진다'라는 표현으로 사용되기도 한다. 

예외-에러 클래스 구조는 구글링 하면 많이 나오니, 간단한 참고용으로만 아래 간소한 클래스 도식 사진을 참조하자^-^,,

 

1. 예외 처리 : try - catch

 

자바 가상머신은 오류가 있으면 프로그램을 종료해버린다. 가상머신은 에러가 뜬 이유는 알지만 개발자가 원하는 예외 처리 방식까지는 예측하지 못한다. 그렇다면 예외의 처리를 가상머신이 아닌 우리가 명시적으로 해주자! 예외의 상황이 있어도 프로그램이 종료되지 않게 조치를 취해주자는 것이다.

 

예외 처리를 위한 문법이 바로, try ~ catch 문이다.

 

잘못된 코드나 값으로 프로그램이 죽을 때, 프로그램은 예외 클래스의 인스턴스를 생성한다. 생성된 예외 인스턴스는 메모리에 올라가고, 예외 클래스에 접근하여 예외 메소드가 예외 상황에 대한 정보를 출력하도록 설정되어 있으니 빨간 글씨로 오류 상황을 출력하는 것이다.  

이렇게 프로그램이 종료되지 않도록 하기 위해 try - catch문을 사용한다. 프로그램이 예외가 발생해서 죽을 때, 예외 객체를 생성하면 catch문이 이름대로 그 객체를 캣취하여 중괄호 속의 코드를 실행한다.

 

다음 예제에서 에러 인스턴스 생성 시점과 try - catch문의 진행 상황을 보자.

import java.util.Scanner;
public class Lecture{
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		try {
			System.out.print("a/b .. a? ");
			int n1=sc.nextInt();

			System.out.print("a/b .. b? ");
			int n2=sc.nextInt();
			System.out.println(n1 / n2);  //에러 발생지점. 에러 발생하는 순간 예외 객체 생성
		} 
        catch(ArithmeticException e) {  //예외 객체를 잡아온다. 코드를 실행한다.
			System.out.println(e.getMessage());
		}
	}
}

 

try문은 다음과 같이 코드가 진행된다. 

try{
           1. ...

           2. 예외 발생지점 //발생시 3번 문장은 실행 X

           3. ...
}
catch(Exception e){
...
}

4. 예외 처리 이후 지점

 즉, 예외가 생길만한 코드를 try로 감싸주고, 예외가 생길 경우 그 예외를 처리하도록 catch를 통해 처리 내용을 알려주는 것이다. try 문이 끝나면 예외 처리가 종료되었으므로 그 다음 문장이 실행된다.

1-1. try 위치 결정

 try 문은 위치에 따라 말짱 도루묵인지가 결정된다. 대개 어떤 기능을 하는 코드 덩어리를 단위로 잡아 try를 붙여준다. 

System.out.print("a/b .. a? ");
int n1=sc.nextInt();

System.out.print("a/b .. b? ");
int n2=sc.nextInt();

//try를 여기 넣게 되면 말짱도루묵.                                 
System.out.println(n1 / n2); 

 위의 예제에서는 a를 b로 나누는 연산을 진행하기 위해 a와 b를 각각 키보드로부터 입력받아 연산을 진행하고 있다. 정수형 연산에서 정수 a를 0으로 나누면 예외가 발생하기 때문에, try를 위 코드의 제일 위에 위치시켜 발생할 수 있는 예외 상황을 차단해야 한다.

try문이 시작되면 그 이후에 catch는 몇개를 넣어도 상관이 없으며, 둘 이상의 예외를 동시에 처리 할수 있다(A | B a) 처럼 '|(or)'을 사용하면 된다. 

 

 

 

예외/오류 참조 - 출처: https://itmining.tistory.com/8 [IT 마이닝]

예제 코드 참조 - 윤성우의 열혈 자바

728x90
반응형

'study_java > java_수강정리(~10.29)' 카테고리의 다른 글

[JAVA]17일차  (0) 2020.06.02
[JAVA]16일차  (0) 2020.06.01
[JAVA]15일차(2)  (0) 2020.05.31
[JAVA]15일차  (0) 2020.05.31
[JAVA]14일차  (1) 2020.05.31