1. 에러(Error)와 예외(Exception)


# 자바 언어를 사용하여 개발한 프로그램에서 발생할 수 있는 오류는 그 종류에 따라서 크게 에러(Error)와 예외(Exception)로 구분된다. 


1) 에러(Error): 프로그램이 더 이상 동작할 수 없는 심각한 오류

2) 예외(Exception): 프로그램 실행 도중 오류가 발생했지만 동작을 계속 수행할 수 있는 오류 


3) 에러가 발생하면 대개 JVM 프로세스 자체가 죽어버려 심각한 상황을 맞이할 수 있다.

그와 반대로 예외는 프로그램 실행 중에 오류가 발생했지만 치명적이지는 않기 때문에 잘못된 결과가 나오거나 결과값을 반환하지 못하는 정도뿐이다. 

하지만 예외가 누적된다면 이도 프로세스가 죽는 상황을 맞이할 수 있다. 


4) 에러에 대해서는 프로그램에서 처리(handling)하지 않고, 예외에 대해서만 처리하며 이를 예외 처리(Exception Handling)라고 부르게 되는 것이다.




2. Throwable 클래스 


1) 계층도


           

- 오류와 관련된 모든 에러와 예외 클래스들은 java.lang 패키지에 속해 있다.

- 오류 관련 클래스들은 기본적으로 Object 클래스를 상속 받는다.

- 모든 예외 클래스의 부모 클래스는 Throwable 클래스이다. 

- Throwable 클래스를 상속받은 클래스만이 try-catch-finally 구문을 사용하여 예외 처리를 실행할 수 있다.

- Throwable 클래스를 상속 받는 클래스는 오직 Exception과 Error 클래스 뿐이다.

* 다수의 클래스들이 Exception 클래스를 상속받는 구조 



2) Throwable = Throw(던지다) + able(할 수 있는)



- Throwable 클래스를 상속받은 자식 클래스들만이 JVM에게 예외 객체로 던져질 수 있으며 예외 처리될 수 있다. 

- Throwable 클래스를 상속받은 클래스만이 throw 구문에서 사용 가능하다. 

- 오류 객체를 만들기만 해서는 예외 처리를 할 수 없고, JVM으로 던질 수 있어야 오류 추적 및 오류 감지를 통하여 try-catch 구문을 사용할 수 있기 때문이다. 




5) throws Exception

(1) throws 키워드가 붙는 클래스에는 Exception에 대한 예외처리를 반드시 해야한다. 


# 예외 처리를 하지 않은 경우




6) FileReader 클래스의 예외 처리 의무화


(1) FileReader 클래스에 대한 예외처리는 반드시 해야한다. 

* ctrl + shift + z, 예외처리 또는 Surround with try/catch 선택




(2) FileReader 클래스의 메소드까지도 예외처리를 의무화 해야 한다.




3. 스택(Stack)


# 배열과 같은 자료의 집합을 의미하며, 예외 처리 및 예외 추적에 필요한 자료구조 알고리즘이다.


1) LIFO(Last In First Out): 가장 마지막에 들어온 것(입력)이 가장 먼저 나가는(출력) 형태

* Pop: 스택에서 자료를 빼는 과정

* Push: 자료를 넣는 과정

* Top: 자료들 중 가장 위에 존재하는 객체




2) 스택 메모리 영역에서는 메모리를 관리하기 위해서 스택 알고리즘을 사용한다.

- JVM 스택 메모리 영역은 '메소드의 호출과 반환값' 에 정보를 저장하는 역할을 한다.

- 스택 프레임에는 매개변수, 지역 변수 그리고 반환값 등의 메소드 정보가 저장된다.

- 메소드가 정상적으로 실행 완료되면 JVM의 스택 메모리 영역에서 삭제된다. 




4. Exception 클래스 



- Exception 클래스는 부모 클래스인 Throwable 클래스와 Object 클래스로부터 상속받은 메소드와 속성 외에는 따로 선언되어 있는 것이 없다. 

- 예외 처리에서 주로 많이 사용되는 예외 클래스들은 Exception 클래스의 자식 클래스들이다.

- 예외 관련된 클래스들은 대부분 자신 클래스에 새로운 메소드(자신에게 새로운 클래스)를 선언하는 것보다

상속받은 메소드를 그대로 사용하거나 오버라이딩해서 사용하는 것이 일반적이다. 



1) Exception 자식 클래스 1: RuntimeException



- RuntimeException은 JVM에서 연산 혹은 논리 작업을 할 때 발생할 수 있는 예외를 의미한다.

* Unchecked Exception: try-catch 구문으로 예외 처리를 하지 않아도 자동으로 예외 처리

* Checked Exception: RuntimeException과 그 자식 클래스들을 제외한 에외 클래스들은 반드시 try-catch 구문으로 처리해야한다. 



2) Exception 자식 클래스 2: IOException



- IOException은 Input/Output 관련 작업을 처리할 때 발생하는 예외 상황

- 파일을 생성하고 어떤 데이터를 쓰거나(Output) 읽을 때(Input) 발생한다.

- IOException은 주로 JVM 외부의 원인에 의해서 발생한다.

- 미디어(Media)에 데이터를 읽거나 쓸 때 발생하는 예외 상황



3) Exception 자식 클래스 3: 그 외의 예외 클래스들