본문 바로가기
개발 관련 강의 정리/10분 테코톡

[10분 테코톡] 케로의 예외처리 정리

by 코딩개발 2023. 6. 2.
728x90
반응형

1. 예외처리의 정의

프로그램 실행 시 발생할 수 있는 예외에 대비하는 것으로 프로그램 비정상종료를 맞고 실행 상태를 유지하는 것

 

 

2. 오류 vs 예외

 

오류는 외부 요인에 의해서 발생하는 것으로 심각한 오류이다. 한번 발생하면 이를 되돌릴 수 없고 이것을 개발자가 예측하기가 힘들다. 예를 들면 메모리가 부족해서 프로그램 자체를 못 돌리게 되는 그런 경우가 속할 수 있다.

예외(Exception)은 개발자의 로직에 의해서 발생한 예외이다. 에러보다는 덜 심각한 상황이고 대비 해주어야 한다.

 

 

3. 예외처리 하는 법

 

 

예외 던지기
- throw는 예외를 강제적으로 던져 준다. 개발자가 임의로 예외를 발생 시킬 때 사용하는 명령어이다.
- 파라미터 안에 있는 메시지는 예외 메시지이다.
- throws는 선언된 예외를 여기서 처리하지 않고 이 함수를 호출하는 곳에서 처리해주겠다는 뜻이다.

 

 

이 함수를 호출하는 곳을 보면 try-catch를 통해서 이 작동을 실행한다. 이 코드를 보면 케로라는 객체를 만들었고 케로가 지하철을 타고 왔고 Spitto를 샀다. 그리고 케로는 행복하다. 마지막으로 케로는 캠퍼스에 도착하게 된다.

 


비정상적인 작동을 본다면 케로가 생성되고 지하철을 타고 왔지만 복권 명당에 왔더니 문을 닫았다. 이런 상황에서는  happy한 이 함수는 실행하지 않는다. 그리고 catch문 안에 있는 로또 명당을 지나친다는 메서드를 수행하고 마지막으로 캠퍼스에 도착한다는 메서드를 수행하게 된다.

 


즉 try 블럭 안에서는 예외가 발생할 가능성이 있는 문장, catch 소괄호 안에는 잡아 줄 예외 클래스, 안에는 예외 발생시 실행시킬 문장, finally 안에는 예외 발생과 상관없이 무조건 실행시킬 문장이 들어오게 된다.

 

예외가 발생했을 때 예외 로그가 남겨져 있다면 예외에 대한 정보를 알 수 있다.

 

 

참조변수 e를 통해서 발생한 예외에 대해 접근할 수 있다. 이 인스턴스 안에는 발생한 예외에 대한 정보들이 들어 있다. printStackTrace를 사용하면 발생한 예외의 메소드가 어디서 발생했는지와 같은 정보들과 호출 스택에 저장돼 있던 예외 정보들을 꺼내 와서 보여주고 예외 메시지도 보여준다. getMessage는 위에서 넣어주었더 예외 메시지를 인스턴스에서 가져와 보여주는 것이다.

 

 

4. 커스텀 예외 클래스

 

커스텀 예외 클래스는 이름에 마지막을 Exception으로 짓는 것이 컨벤션이고 Exception이나 RuntimeException을 기본적으로 상속 받는다.

 

 

Exception을 상속 받는 예외 클래스가 Checked Exception이다. 이 예외 클래스는 컴파일 단계에서 예외를 확인하기 때문에 예외처리를 강제하도록 되어 있다. 때문에 개발자의 실수가 줄어들 수 있다는 장점이 있지만 모든 예외를 핸들링 해줘야 하기 때문에 번거롭다. 예외를 계속해서 throw 해줄 수 있어서 계속 throw 하니까 레이어 간의 의존성이 높아질 수 있다는 단점이 있다. 또 Stream 내에서 사용이 불가능하다.


Runtime Exception을 상속하는 Unchecked Exception은 실행 단계에서 예외를 확인하고 예외 처리를 강제적으로 명시하고 있지 않다. 그래서 throw 를 해줄 일이 없기 때문에 레이어 간의 의존성이 줄어들고 반대로 개발자의 실수가 늘어날 수 있다는 단점이 있다.

 


다시 코드로 돌아와서 기본 생성자를 하나 만들고 예외 메시지를 받아서 오버로딩해주는 것이 기본이다. 

 

 

커스텀 예외 클래스 사용의 장단점

장점 단점
클래스 이름 만으로도 정보 전달이 가능 표준 예외를 사용하는 것이 가독성이 좋음
해당 예외에 대한 응집도가 향상됨 커스텀 예외 클래스가 많아지면 복잡해지고 관리해야 할 클래스가 많아진다.

 

 

5. 자주 쓰이는 표준 예외 클래스

 

 

Exception을 상속하는 예외들은 기본적으로 외부 요인에 의해 발생하는 예외가 많다. IOException은 자바의 모든 입출력 에 대한 예외 발생시 사용하고 FileNotFoundException은 디스크에 없는 파일에 대한 액세스 시도가 실패한 경우 사용한다. RuntimeException을 상속하는 예외 클래스들은 개발자의 실수에 의한 예외들이 많다. IllegalArgumentException은 허용하지 않는 값이 인수로 건네줬을 때 발생한 예외에 사용한다. IlligalStateException은 객체가 메서드를 수행하기에 적절하지 않은 경우 사용한다. NullPointerException은 null을 허용하지 않는 메서드에 null값을 겼을 경우 사용한다. IndexOutOfBoundsException은 인덱스가 허용 범위를 넘겼을 때 사용한다. 

 

6. 예외처리 장단점

 

예외를 잘 처리해 준다면 프로그램의 안정성이 향상 되고 유지 보수와 디버깅이 쉬워진다는 장점이 있지만 너무 남발하게 된다면 코드의 가독성을 떨어뜨릴 수 있고 로직에 많이 들어가면 성능상 많이 늦어질 가능성이 있다. 즉 예외를 진짜 예외 상황에만 써주는 게 좋다.


그렇다면 진짜 예외 상황이란 뭘까?

위에서 예시로 들었던 상황, 정말 예외 상황일까?

 

 

위와 같이 바꾼다면 더 보기 좋고 편할 것이다.


참고

https://www.youtube.com/watch?v=mrrEPbGF6hQ&ab_channel=%EC%9A%B0%EC%95%84%ED%95%9C%ED%85%8C%ED%81%AC 

728x90
반응형

댓글