오늘의 학습 키워드

  1. 예외
  2. try-catch, finally 문
  3. 예외 클래스 구조
  4. 3주차 내용 복습

1. 예외

  • 오류: 일반적으로 회복이 불가능한 문제
  • 예외: 일반적으로 회복이 가능한 문제
  • 코드실행 관점에서 예외종류: 컴파일 에러, 런타임 에러
    • 컴파일 에러: 자바 언어의 규칙을 지키지 않았을 때 발생하는 에러
    • 해결방법: 문법에 맞게 다시 작성
    • 런타임 에러: 컴파일은 잘 되었지만 "프로그램"이 실행도중 맞닥뜨리게 되는 예외
  • 예외처리 관점에서 예외종류: Checked Exception, Unchecked Exception
    • Checked Exception
      컴파일 시점에서 확인하는 예외
      반드시 예외처리를 해줘야함
      ** Checked Exception과 컴파일 에러 혼동 주의
      Checked Exception에 대한 예외처리를 하지 않으면 컴파일 에러가 발생
    • Unchecked Exception
      런타임 시점에서 확인되는 예외
      예외 처리가 반드시 필요하지 않음

2. try-catch, finally 문

  • 예외 처리 흐름
    1. 예외를 정의
    2. 예외가 발생할 수 있음을 알림
      ** 예외가 발생할 수 있는 logic에 어떠한 flag를 달아 놓음
    3. 예외 핸들링
  • 예외 정의: 예외 클래스를 만들어 예외를 정의
class OurBadException extends Exception {
	public OurBadException() {
		super("위험한 행동을 하면 예외처리를 꼭 해야합니다!");
	}
}

📌 Exception을 상속받아서 구체적인 예외사항 정의
📌 super(...): 부모클래스의 생성자 호출 => 생성자를 호출하는 데 안에 들어가는건 매개변수

  • 예외가 발생할 수 있음을 알림 - throw, throws
class OurClass {
    private final Boolean just = true;
		
    public void thisMethodIsDangerous() throws OurBadException {
        if (just) {
            throw new OurBadException();
        }
    }
}

📌 thisMethodIsDangerous() 이 메소드가 위험하다는 것을 알림
📌 위 메소드가 실행될 때는 just로 들어왔다고 한다면 새로운 OurBadException()을 만들어서 던짐
📌 던질 수 있는 이유: throws OurBadException 플래그를 달아줬기 때문에

  • throws - 플래그를 붙이는 것
    • 메소드 이름 뒤에 붙어 이 메소드가 어떠한 예외사항을 던질 수 있는지 알려줌
    • 여러 종류의 예외사항을 적을 수 있음
  • throw
    • 메소드 안에서 실제로 예외 객체를 던질 때 사용
    • 실제로 던지는 예외 객체 하나와 같이 써야 함
    • throw문과 함께 메소드 종료

=> 메소드를 선언할 때, 이 메소드가 위험하다는 것을 미리 에측해야 함.
그리고 예측이 되어 있다면, 실제로 throw 키워드와 함께 이 메소드가 위험하다고 알려야 함.

  • 예외 핸들링
public class StudyException {
    public static void main(String[] args) {
        OurClass ourClass = new OurClass(); // 인스턴스 화

        try {
            // 일단 메소드 실행
            // this-메소드가 위험하다는 것을 throws OurBad-로 플래그 달아 놓았기 때문에 그냥 호출하면 안됨 => try-catch, finally구문 사용해야함
            ourClass.thisMethodIsDangerous();
        } catch (OurBadException e) {
            // () -> 어떤 종류의 예외 사항을 catch할 것인지
            // 소괄호 안에는 인스턴스화해서 들어가야함
            // 예외가 발생하면 catch해서 핸들링
            // 예외가 발생하면 바로 코드 실행 멈추고 이 블록 내의 코드가 실행됨
            System.out.println(e.getMessage());
        } finally {
            // 무조건 실행되는 코드가 들어가는 블럭
            System.out.println("우리는 방금 예외를 handling 했습니다!");
        }

    }
}

** 1개의 try문에 여러 개의 catch문 사용 가능
📌 위의 경우는 Checked Exception

3. 예외 클래스 구조

  • Checked Exception
    사전에 알고 있어서 예외 처리한 예외 -> 예외처리를 해놓지 않으면 컴파일 시에 오류 발생 => 우리가 주로 다루는 것
  • Unchecked Exception
    런타임 때 발생하기 때문에 예측할 수 없음
    • RuntimeException을 상속한 예외들은 UncheckedException, 반대로 상속하지 않은 예외들은 CheckedException으로 구현되어 있음
    • RuntimeException은 사전에 예방할 수 있다기 보다는 실행과정에서 일어나는 예외 -> Unchecked exception
    • RuntimeException을 구현하지 않은 것들은 Checked exception
  • RuntomeException(실행중 예외)
    • NullPointException: 존재 하지 않는 값 예외
    • NumberFormatException: 숫자로 바꿀 수 없는 변수 예외
    • ArrayIndexOutOfBoundsException: 배열의 크기를 벗어난 조회 예외
  • 대부분의 상황에 맞는 에러들은 이미 구현되어 있지만 없다면 특정 에러를 더 구체화해서 직접 정의, 구현하면 됨

4. 3주차 내용 복습

📍 인스턴스 멤버 & 클래스 멤버

  • 필드가 static으로 선언되어 있고 메소드가 인스턴스인 경우는 가능
  • 필드가 인스턴스로 선언(static 키워드가 없는)되어 있고 메소드가 static 키워드를 사용한 경우는 불가능
  • static 키워드로 지정하면 인스턴스화를 안해도 언제든 호출하여 사용 가능하기 때문에 필드가 인스턴스이고 메소드가 static인 경우는 불가능
  • 기본 생성자가 아닌 매개변수가 있는 생성자를 사용하여 인스턴스할 경우 클래스 안에는 this 키워드를 사용하여 필드를 초기화해주는 생성자가 존재해야함
profile
안녕하세요

0개의 댓글