개발을 하다보면, "예상치 못한" 상황을 많이 마주하게 된다. 대표적인 경우가 오류, 예외

 

오류(error) : 일반적으로 회복이 불가능한 문제. 주로 시스템 레벨에서, 주로 환경적인 이유로 발생

                    코드의 문제로 발생하는 경우도 있지만, 일단 발생하는 경우 일반적으로 회복이 불가. (종료되기때문)

                    에러 발생 시 어떠한 에러로 프로그램이 종료되었는지를 확인하고 대응 (logging 처리)

 

예외(Exception) :  일반적으로 회복이 가능한 문제

                               회복이 가능하다는 전제는, 그 예외가 발생할 수 있다는 것을 인지하고 대응했을 것

                               현실적으로 코드레벨에서 할 수 있는 문제상황에 대한 대응은 "예외처리"에 속함

                               ==> 예외처리를 자세하게 할 수록 완성도 높은 구현 가능

                               ==> 습관을 잘 들여놓는게 중요하다!!

 

<예외(Exception)의 종류>

1. 컴파일 에러(예외) : 컴파일 단계에서 발생하는 오류 (.java ==> .class)

-    대부분의 경우 코드 작성 단계에서 프로그래밍 언어의 규칙을 지키지 않았기 때문에 발생(클래스명, 접근가능여부 등)

-    해결방법 : 문법에 맞게 코드 수정

 

2. 런타임 에러(예외) : 주로 처리하게 될 에러(예외)로서, 컴파일은 잘 되었지만 프로그램이 실행도중 발생하는 에러

-    Checked Exception : 확인된 예외로서, 컴파일시점에 check하는 예외. 이것에 대한 처리를 하지 않으면 컴파일 에러

-    Unchecked Exception : 런타임 시점에 확인되는 에러로서, 예외처리가 반드시 필요하지 않음

 

<예외 발생과 try-catch, finally 문>

1. 예외를 어떻게 정의할 것인지 : 클래스를 만들어서 한다. extends Exception

2. 예외가 발생할 수 있음을 어떻게 알릴지 : 예외가 발생할 수 있는 logic에 flag를 달아놓는다 ?

3. 사용자는 예외가 발생할 수 있음을 알고 예외를 핸들링하는지

==> 이 흐름에서 나오는 것들이 try, catch, finally, throw 같은 키워드

 

예시)

<예외 클래스 만들기>

- Exception 클래스를 상속받아 만든다.

class ourException extends Exception(){

    public ourException(){

        super("출력할 메세지?")                                   

    }

}

 

<예외가 발생할 수 있는 메소드에 선언부에 flag(표시)>

- 메소드를 선언할 때 뒤에 throws ourException을 붙이고, 내용부분에서 exception을 정의하고, 예외클래스 생성, throw

public void dangerousMethod() throws ourException

    if(확인할조건){

        throw new ourException                 ==>  throw를 만나면 return을 만난것처럼 종료된다.

        }

    else{

            원래내용....

        }

}

 

<예외발생하는 메소드 사용 시 try-catch-finally 사용>

....코드 중...

 

try{

    // 예외처리가 되어있는 메소드를 "시도" 해보는 부분

    ourClass.dangerousMethod();

}catch( ourException e ){

    System.out.println(e.getMessage());          //  ourException e는 Exception을 상속받았기때문에 getMessage를 사용가능

                                                                       //  message는 ourException의 생성자에서 super로 넘겨줬다.

} finally {

    예외가 발생하든 발생하지 않든, 실행될 로직;

    // 예외가 발생하면 핸들링 후 실행, 발생안하면 그냥 실행.

}

 

===> 만약 throws로 처리가 되어있는 메소드를 쓸 때, try-catch문을 사용 안해주면 컴파일 오류가 난다.

 

<Exception 클래스 구조>

수많은 에러에 대한 것을 추상화하고, 객체로 만들어 주는 것은 어려운 일이다.

위에 나온 에러 대응 프로세스는 언어 설계 차원에서의 대응 프로세스이기도 하기 때문에, 이 문제들을 추상화 해서 객체로 만들어주는 것은 자바 언어에서 지원해준다. 따라서, 현실에서 마주하는 개념이나 이슈들을 객체지향 프로그래밍으로 어떻게 구현하는지에 대한 좋은 예시로서 공부할 수 있다.

 

==Java의 Throwable Class==

-시작은 모든 객체의 원형인 Object 클래스.

- Throwable Class는 "문제 상황"을 뜻하는 클래스 --> 자식으로 Error와 Exception 클래스가 있다.

- Error와 Exception 클래스는 각각 IOerror 클래스, RuntimeException 클래스와 같이 구분되어 처리된다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

          

+ Recent posts