개발을 하다보면, "예상치 못한" 상황을 많이 마주하게 된다. 대표적인 경우가 오류, 예외
오류(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 클래스와 같이 구분되어 처리된다.
'공부 > Java' 카테고리의 다른 글
Java 문법 (4) - 상속관련 super // override // 다형성 // 추상클래스 (0) | 2023.04.05 |
---|---|
Java 문법 (3) - 생성자 // 제어자 // getter, setter // 상속 // 추상화 //인터페이스 // (0) | 2023.04.05 |
Java문법 (2) - 클래스 // 객체 // 메서드 (0) | 2023.04.05 |
Java 문법 - 연산자 // 반복문 // 배열 // 컬렉션 (0) | 2023.04.04 |
Java 개요 // JVM // 저장공간 // 변수와 상수 // 형변환 (0) | 2023.04.03 |