티스토리 뷰
포스팅에 앞서 내용이 틀릴 수 있습니다.
해당 부분 지적 감사히 받습니다.
자바에서 프로그램 로직을 짜다가 만약 문제가 생기면 어떻게 될까?
문제의 종류에 따라 다르겠지만, 자바는 이럴 때 오류를 내뱉으며 즉시 프로그램을 종료한다.
물론 자바뿐만 아니라 다른 프로그래밍 언어들 또한 그렇다.
자바에서는 예외처리를 통해 해당 프로그램의 오류 흐름에서 다시 정상 흐름으로 바꿀 수 있게 해 준다.
이 과정을 예외처리라고 한다.
또한.. 예외처리를 함으로써, 개발자가 코드를 읽을 때, 정상 흐름과 오류 흐름을 나눠 볼 수 있음으로, 가독성 또한 챙겨갈 수 있다.
일단 예외처리에 사용되는 키워드를 알아보자.
try : try뒤에 중괄호가 나오며, 이 지역에서 발생하는 예외를 탐색한다.
catch : try 지역 끝에 바로 나오며, try 동안 발생하는 예외처리를 잡는다.
finally : 예외처리가 있든 없든, try 지역이 끝나면 반드시 실행된다.
throw : try 지역 안에서 쓰이며 예외를 발생시킨다.
throws : try 안에서 잡힌 예외를 특정 객체 타입으로 외부로 던진다.
그리고 이렇게 쓴다.
try{ // 1
로직(); // 2
}catch(예외종류 e){ //7
잡힌 예외 처리해서 정상 흐름으로 바꾸기 // 6
}
finally{
이건 꼭 실행해야 겠다 싶은거 //9
}
public void 로직() throws Exception //6{
정상 로직중 // 3
if(문제 발생){ // 4
throw 예외 발생 // 5
}
}
실행 순서대로 주석을 달아놨다.
여기서 6번에 대해서 좀 알고 넘어가야 하는데, 6번은 Exception을 밖으로 던질 때, 예외의 반환 타입에 대해 결정하는 것이다.
즉 어떤 오류가 발생해도 Exception 타입에 담아서 던지겠다는 것이다.
자 여기까지 설명을 들었으면 떠올라야 하는 의심이 하나 있다.
그렇다 예외도 객체이다.
그리고 어떤 예외든 Exception에 담긴다.(예외들의 부모)
예외도 종류가 많은데.. 잘 찾아보길 바란다 ㅎㅎ
또 자바에서 오류는 Error와 Exception이 있는데 error는 잡을 필요가 없다.
왜냐면 잡아도 개발자가 할 수 있는 게 없기 때문이다.
메모리가 부족하거나 심각한 시스템 오류가 발생한걸 개발자는 어찌할 수 없기 때문이다.
이제 예외처리의 기본 규칙 2가지에 대해 알아보자.
1. 예외를 잡아 처리한다.
2. 예외를 밖으로 던진다.
이 둘 중 하나를 선택해서 개발하면 된다.
던진다는 건 예외가 발생한 부분을 호출했던 (메서드) 곳으로 던진다는 것이다.
하지만 예외를 처리하지 않고 계속 던지면 결국 main 메서드에까지 가게 되는데, 여기에서도 처리 안 하고 던지면?
프로그램 꺼진다. 즉 언젠가는 예외처리를 해줘야 한다.
Object -> Throwable -> Exception -> checkException (체크 예외)
ㄴ RuntimeException (언체크 예외)
예외의 계층은 위와 같이 이루어져 있다.
체크 예외, 언체크 예외로 나뉘며, 이 둘의 차이점은 개발자가 체크 예외를 발생시켜 놓고 이를 잡아 처리하는 로직을 만들지 않으면, 컴파일 단에서 오류를 내준다.
즉 개발자가 미구현하는 예외처리가 없게끔 해준다.
언체크 예외는 자바 컴파일러가 예외처리가 안되어 있어도 체크하지 않는다.
이 두 설명만 들으면 당연히 체크 예외를 쓰는 게 프로그램 안정성이 더 있지 않을까 하고 생각이 드는 게 당연하다.
하지만 실무에서는 언체크 예외를 더 많이 사용한다.
왜냐하면 체크 예외는 발생할 수 있는 모든 예외에 대해 각자 따로 처리해줘야 하는데, 이 과정이 번거롭기 때문이다.
또한 RuntimeException은 애초에 프로그램이 돌아가면서 예상치 못하게 발생할 수 있는 부분이라, 자바가 컴파일단에서 잡아낼 수도 없다. (ex) DB값 조회해 오는 데 있을지 없을지 모른다.)
자 RuntimeException은 위 코드에서 나온 6번이 필요 없다.
왜냐하면 자바가 체크 안 할 거니까 그냥 자동으로 예외가 생기면 던져준다.
기본적으로 생략하는 게 맞고, 해당 예외가 너무 중요하면 써넣어도 상관은 없다.
그러면 RuntimeException(언체크) 예외의 장단점은 무엇일까?
장점 : 신경 쓰고 싶지 않은 예외를 무시할 수 있다.
단점 : 실수로 예외처리를 누락할 수도 있다.
체크 예제와 언체크 예제는 서로의 장단점이 완전히 반대로 겹친다.
finally는 예외가 발생해도, 발생 안 해도 결국엔 실행된다.
왜 필요하냐면, DB에 연결하는 로직을 만들었을 때, 중간에 예외가 발생하면 프로그램이 그 즉시 중단이 되어버린다.
따라서 finally 지역에 DB연결을 해제하는 코드를 넣어 서버 연결을 확정적으로 종료시킬 수 있다.
예외처리는 이 정도만 알아도 될듯하다.
추가적으로 try with resource 만 알아보자.
이는 앞서 설명한 DB연결과 해제에 관련해서 더 확실하게 해 준다.
이를 사용하기 위해선 AutoCloseable 인터페이스를 구현해야 한다.
public interface AutoCloseable{
void close() throws Exception;
}
그리고
try (Resource r = new Resource()){ }
기존 try에 소괄호를 넣고 아래와 같이 사용하면, try 가 끝날 때 자동으로 close() 메서드가 호출이 된다.
finally가 있는데 귀찮게 인터페이스 생성하고 이걸 왜 써야 하나 의문이 들 수도 있다.
try with resource의 장점은
- 리소스 누수방지
- 코드 간결성 (가독성 향상)
- 스코프 범위 한정
- 조금 더 빠른 자원 해제
등이 장점으로 있기 때문이다.
끝!
'기술스택 > 자바(Spring)' 카테고리의 다른 글
자바 제네릭 메서드 (Generic Method) (1) | 2025.02.22 |
---|---|
자바 제네릭(Generic) (0) | 2025.02.22 |
자바 익명 클래스 + 람다식(간단) (1) | 2025.02.18 |
자바 중첩 클래스, 내부 클래스 (2) | 2025.02.17 |
자바 타입 안전 열거형 + Enum (1) | 2025.02.16 |
- Total
- Today
- Yesterday
- ys.k
- 백준
- spring
- static
- samron3
- 김영한
- 김영한 실전 자바 중급
- 김영한 실전 자바 기본
- extends
- 백준 피보나치
- 자바
- 프로그래머스
- zixem
- 프로그래머스 상품을 구매한 회원 비율 구하기
- 백준 피보나치 수열
- 기술스택
- los 15
- webhacking.kr
- lord of sql
- 상품을 구매한 회원 비율 구하기 파이썬
- 스프링
- 코딩테스트
- 상속
- 코딩테스트 준비
- Los
- 프로그래머스 상품을 구매한 회원 비율 구하기 파이썬
- samron
- los 15단계
- java
- 김영한 실전 자바 기초
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |