JAVA,객체지향

예외처리란?

25G 2021. 12. 1. 11:19

예외처리는 Exception이라고 한다.

예를 들어서 슈퍼마켓을 운영을 하는데에 위험 요소 및 준비해야 할 것 들을 생각해보자.

1. 도둑을 잡기 위해 cctv 설치

2. 잔돈 준비

2. 직원 채용

3. 장소 임대

등등 이 있다.

그렇게 준비할 것을 준비를 해 놓고 운영을 시작해서 장사를 하다 보면 생각지도 못한 문제점들이 생길 수 있다.

잔돈이 모자랄 수 있다.

cctv 사각지대에 있는 물건이 도난당했다. 등등..

 

그럼 위 상황을 크게 두 가지로 나눌 수 있는데

운영전/운영후

 

java에서 운영전(실행 전)에 일어나는 준비과정 및 위험요소 제거는 jvm이 알아채고 오류를 발생시켜 예외처리(try/catch)를 하도록 개발자에게 강제로 시켜버린다.

운영 후에 생기는 예외에 대한 처리는 런타임 시에 일어나기 때문에 개발자가 알아야 한다.


예외처리 try/catch(컴파일 시 오류)

 

일단 먼저 대표적인 컴파일 시에 발생하는 예외를 보자

저 문제를 해결해 주지 않으면 컴파일 자체를 해주지 않겠다고 java에서 얘기하고 있다.

그럼 위에서 시키는 대로 try/catch를 눌러보면 

자 왜 컴파일 오류가 날까?

cpu가 일을 하다가 잠깐 1초 정도 자라고 명령을 받고 수면에 들어갔는데 한 0.3초 정도 지난 시점에 갑자기 컴퓨터에서 치명적인 오류가 발생할 수 있다. 그럼 이를 놔둘 수는 없기 때문에 만약에 그런 일이 생긴다면 cpu를 깨워서 일을 시켜라고 하는 명령을 내리는 것이다.

즉 위와 같이 혹시 모르게 일어날 수 도 있는 문제를 미연에 방지하는 것이 예외처리이다.

 

그럼 실행은 어떻게 되는지 알아보자

try의 {}에 있는 명령문을 실행하다가 문제가 생기면 catch로 가고 그렇지 않고 정상적으로 실행된다면 catch에 있는 코드를 타게 된다.


 

런타임 시 오류

 

위 경우에서는 컴파일 시에 jvm이 알아채지는 못했지만 런타임 시에 오류가 발생하여서 생긴 오류다. 그래서 위 Exception문구를 보면 왜 오류가 났는지 말을 해주고 있는데

이 오류명을 복사해서 try/catch로 묶어보자.

자 위 주석에서 처럼 프로그램이 오류를 만나더라도 catch가 그 오류를 잡아서 catch본인이 들고 있는 코드들을 실행시킨 후 나머지 main에 있는 실행코드들을 실행시키는 것을 볼 수 있다.

그럼 위 catch에 있는 "e"라는 매개변수로 오류가 났을 시에 개발자가 처리하기 수월하도록 메서드를 제공해 준다.

실무에서는 다음과 같은 오류 로그를 파일로 남겨놓고 프로그램 유지보수 시에 조금 더 수월하도록 문서화해놓는다.

 

그러면 개발자가 다음과 같은 오류 메시지를 다 알고 모든 상황을 파악을 해야 할까?

물론 그러면 좋겠지만

객체지향 프로그래밍과는 거리가 먼 행위인 것 같다. 모든 오류를 파악하기엔 굉장히 고통스럽고 힘들다.

위 상황과 같은 모든 Exception의 부모는 Exception이 상속하기 때문에

컴파일 시에 일어나는 예외처리의 catch 매개변수의 타입은 Exception으로 하는 것이 수월하다.

어차피 그렇게 되면 자식이 부모의 함수를 오버 라이딩해서 동적 바인딩되면 정상적으로 실행이 될 것이다.

 

그리고 런타임 시에 발생하는 오류는 RuntimeException타입으로 설정해 주면 된다.

이유는 위와 같다.

 

'JAVA,객체지향' 카테고리의 다른 글

버퍼(Buffer)란?  (0) 2021.12.02
String Constant Pool  (2) 2021.12.02
스레드란?  (0) 2021.12.01
제네릭이란?(와일드카드)  (0) 2021.11.28
SRP와 DIP  (0) 2021.11.26