🚀 학습 목표 & 예상 결과
- 자바의 신 14~16장 읽고 정리하기
- 내용 요약과 추가적으로 학습하게 된 내용들 정리 5시간 -> 4시간 (14장만 공부)
📌TIL
14장 - 예외라는 중요한 것이 있다.
예외
- 예외적인 일. 우리가 예상했거나 예상치 못한 일들이 발생할 것을 예견해 미리 안전장치를 준비해 두는 것.
- try-catch 예외X : try 내 모든 문장 실행 -> try-catch 이후 내용 실행
- try-catch 예외O : try 내 예외 발생 이전 문장만 실행 X -> catch내의 문장 실행 -> try-catch 이후 내용 실행
- finally : 예외 여부와 상관없이 항상 실행된다.
- catch 문은 다중 생성이 가능하며, 예외 발생 시 if문처럼 순차적으로 확인하며 처음 일치하는 catch블록이 실행된다. (나머지는 무시)
- 먼저 선언한 catch 블록의 예외 클래스가 다음 선언한 catch블록보다 상위 클래스라면(부모라면) 컴파일이 되지 않는다. (자식 catch블록은 절대 실행될 일이 없기 때문.)
- Exception catch 블록이 없을 경우, 실행 시 Exception(예외 로그)을 발생시키며 해당 스레드는 종료된다.
- catch 문 내에 아무런 작업 없이 공백을 놔둬도 실행은 가능하나, 이후 분석이 어려워지므로 꼭 로그 같은 예외 처리를 해줘야 한다.
예외의 종류
- checked exception (일반 예외 / 컴파일 체크 예외)
- 자바 소스를 컴파일하는 과정에서 발생한 예외.
- 주로 외부 리소스 접근, 입출력 작업, 네트워크 통신 등과 관련된 예외다.
- 예외 처리가 필수적이며, try-catch 블록이나 throws 문을 사용하여 예외를 처리하지 않을 시 컴파일이 되지 않는다.
- error(에러)
- 자바 프로그램 밖에서 발생한 프로그램이 처리할 수 없는 예외. - 프로세스 전체에 영향을 준다.
- JVM 내부에 오류가 났다거나, 메모리가 부족하다거나, 서버의 디스크가 고장 났다거나, 메인보드가 맛이 갔다거나 하는 이유.
- runtime exception(런타임 예외 / 비체크 예외 / 실행 예외)
- 실행 도중에 발생할 수 있는 예외로, 컴파일러가 체크하지 않는다. 예외가 발생할 것을 미리 감지하지 못했을 때 발생한다. (ex. NullPointerException)
- 주로 프로그래머의 실수나 잘못된 로직으로 인해 발생하는 예외다.
- 반드시 try-catch 블록이나 throws문을 작성할 필요는 없다. (다만 예외가 터지면 프로그램이 멈춘다.)
Exception과 Error의 공통 부모 클래스는 Object와 java.lang의 Throwable 클래스다.
- 즉, Exception과 Error를 처리할 때, Throwable로 처리해도 된다.
- 가장 많이 사용되는 메소드
- getMassage() : 예외 메시지를 String 형태로 제공받는다. (어떤 예외가 발생되었는지 확인)
- toString() : 예외 메시지를 예외 클래스 이름과 함께 자세한 String 형태로 제공 받는다.
- null
java.lang.NullPointException
- printStackTrace() : 가장 첫 줄에 예외 메세지를 출력하고, 두 번째 줄부터 예외가 발생하게 된 메소드들의 호출 관계(스택 트레이스)를 출력해 준다. 에러로그라고 생각하면 편하다.
- null
java.lang.NullPointException
at c.exception.ThrowableSample.throwable(ThrowableSample.java:12)
at c.exception.ThrowableSample.main(ThrowableSample.java:6)
예외를 던지는(발생시키는) throws
- 정상적인 처리가 불가능한 경우 예외를 발생시켜 넘긴다거나, 예외 처리를 위임하는 용도로 사용한다. (물론 프로그램을 반드시 예외를 발생시키는 형식으로 만들 필요는 없다.)
- throws의 처리방식
- catch문에 throws한 예외와 동일하거나 상속 관계에 있는 예외가 있다면 처리를 한다.
- catch문에 throws한 예외와 동일한 내용이 없다면, 예외를 발생시킨 메소드로 던져버린다.
- public void throwsException(int number) throws Exception { ... } 같은 형식으로 선언 시, 내부에서 예외를 잡는 처리를 하지 않아도 된다.
- 두 개 이상의 예외 발생이 가능하다면, implements처럼 콤마로 구분하여 예외 클래스를 적어주면 된다.
- 해당 메소드를 호출한 메소드에서는 반드시 try-catch로 메소드를 감싸줘야 한다. 그렇지 않을 시 컴파일 에러가 발생한다. (물론 호출한 메소드 역시 throws 해버려도 되긴 한다. 하지만 그러지 말자.)
- catch 블록에서 예외를 throw 한다면, 메소드 선언의 throws 구문에 항상 예외가 정의되어 있어야 한다. (호출자에게 해당 예외를 처리하도록 강제하는 것이다.)
- try-catch의 catch블록에서 예외를 throw를 하고, 다시 try-catch 블록을 생성하면서 다중 try-catch문도 생성할 수 있다.
try {
// 예외가 발생할 수 있는 코드
} catch (ExceptionA e) {
try {
// 예외 처리 코드
throw new ExceptionB(); // 즉시 처리할 예외를 발생시킨다
} catch (ExceptionB ex) {
// 예외 처리 코드
}
}
- 찾아본 결과, 그 외에도 try-catch문의 중첩을 사용하는 경우도 있던데 아직은 이유가 잘 와닿지 않는다. (찾아본 결과를 적어두긴 하겠다.)
- 예외 처리 세부 단계 구분 : 코드 블록 B에서 발생한 예외를 다른 예외로 변환한다던가, B에서 발생한 예외를 C에서 처리하도록 변경하거나 추가적인 정보를 제공하는 등에 이용.
- 예외 발생 시 추가 작업 수행 : catch 블록 B에서 발생한 예외 처리를 마치고, 다른 try-catch문으로 추가작업을 처리.
커스텀 예외 제작도 가능하다.
- Exception을 처리하는 예외 클래스는 Throwable이나 그 자식 클래스의 상속을 받아 개발자가 임의로 추가해서 만들 수 있다.
- 반드시 try-catch로 묶어줄 필요가 있을 경우 Exception클래스의 상속을,
- 실행 시에 발생할 확률이 높은 경우에는 RuntimeException의 상속을 받는 것이 좋다.
- 상속을 받고, 예외 관련 클래스를 확장하면 끝이다.
🔗 Feedback
◾ 예상 결과 <> 실제 결과
여러 이유로 예상보다 절대적인 공부 시간이 적어졌고, 집중도 잘 안돼서 진도를 제대로 못 나갔다.
게다가 중간에 try-catch 중첩문에 빠져서 거의 한 시간을 허우적거렸다. ㅠㅠ ㅋㅋㅋ
그래도 어제보단 집중력이 높았으니 조금씩 이렇게 루틴을 되찾아가면 될 것 같다.
◾ 성공 비결 & 실패 이유
루틴을 되찾기 시작한 것, 어제보다 정확히 두 배만큼 열심히 한 것, 그냥 한 것
여러 가지 사건사고, 멘탈&신체관리 실패, 완벽히 되찾지 못한 루틴, 절대적인 공부시간 부족
◾ 좋았던 것, 부족했던 것, 개선할 것, 긍정 한마디
- 좋았던 것: 루틴을 되찾기 시작한 것, 어제보다 두 배만큼 열심히 한 것, 운동한 것, 자바책을 펼쳐본 것 (이대로 버려지는 줄 알았다.)
- 부족했던 것: 절대적인 공부시간, 흔들리지 않는 멘탈
- 개선할 것: 현재처럼 원래 루틴을 찾아가도록 노력하되, 오늘보다 더 집중해서 오랜 시간 공부하기. (낮부터 텐션 되찾기), 사건사고가 생기더라도 흔들리지 않도록 현재에 머무는 연습하기.
- 긍정 한마디: 어제보다 두 배나 열심히 했다. 대단해! 오늘 하루도 수고했고 이젠 꽃길만 걷게 될 거야. 공부하는 거 솔직히 재밌잖아. 딱 이만큼씩 조금씩 더 열심히 해보자.
◾ 결론
- 일상 루틴 되찾기.
- 운동 지속하기.
- 더 높은 각도로 치켜 올라간 상승곡선 만들기.
- 솔직히 공부하는 거 재밌으니까, 남들이 공부에 미쳤다고 생각할 정도로 열심히 해보자!
- 요즘 코딩이 그렇게 재밌는데, 멈춰놨던 영한님 강의를 건드려보자. (Spring으로 내가 설계한 무언가를 제작해보지 못한 한 풀기)