2023/04/06

이동규·2023년 4월 9일

오류 및 예외에 대한 이해

  • 예상치 못한 상황들로 인해 오류를 직면할 수 있다.
    • 우리가 위에서 발생한 것 같은 문제를 정의하는 것에서 시작 → 정의가 정교할수록 대응할 여지가 많아짐
  • 예외 처리 / 오류 처리를 습관화 해야 한다!!
  • 예외 vs. 오류
    • 오류
      • 문제가 발생하면 프로그램이 종료됨
      • 일반적으로 회복이 불가능한 문제
      • 시스템 레벨 or 환경적인 이유로 발생
      • 어떠한 에러가 발생했는지 확인 후 대응
    • 예외
      • 회복이 가능한 문제
      • 예외가 발생할 수 있다는 것을 인지, 대응
      • 코드 레벨에서 할 수 있는 문제상황에 대한 대응은 예외처리에 속함
      • 컴파일 에러 → 문법적인 오류 → 코드만 수정하면 됨
      • 런타임 에러 → 우리가 주로 다루게 될 에러 → 컴파일은 잘 되었지만, 프로그램 실행 도중에 맞닥뜨리게 되는 예외
      • 예외 종류
        • 확인된 예외
          • 컴파일 시점에 확인하는 예외
          • *Checked Exception에 대한 예외처리를 하지 않으면 컴파일 에러가 발생
        • 미확인된 예외
          • 런타임 시점에 확인되는 예외
          • 예외 처리가 반드시 필요하지 않은 예외
  • 예외 발생과 try-catch, finally 문
    • 예외 처리의 흐름 미리보기
      • 우리가 예외를 어떻게 정의할 것인가
      • 예외가 발생 할 수 있음을 알리는 것
        • 예외가 발생할 수 있는 logic에 어떠한 flag를 둘지
      • 사용자는 예외가 발생 할 수 있음을 알고 예외를 핸들링 하는지
    • 예외에 대한 정의는 class로 한다.
    • try-catch, finally 문
      • try : 시도하다

      • catch : 잡다

      • finally : 마침내

      • 일단 try해 ~~ 그리고, 예외가 발생하면 그걸 잡아!!(catch), 그리고 정상적으로 수행되든, 예외가 발생하든 결국, 마침내 수행돼야 하는 로직을 ‘finally’ 수행해!!

        try{
        
        } catch() {
        
        } finally() {
        
        }
      • 예외 클래스를 만들어 예외를 정의

        class OurBadException extends Exception {
        	public OurBadException() {
        		super("위험한 행동을 하면 예외처리를 꼭 해야합니다!");
        	}
        }
      • 클래스를 만들고, 메서드를 만들며 우리의 메서드가 위험하다고 알리기(throw, throws)

        class OurClass {
            private final Boolean just = true;
        		
        		// 신규 문법 throws : 예외를 던지다/발생시키다.
            public void thisMethodIsDangerous() throws OurException {
                if (just) {
        						// 신규 문법 throw : OurException을 던져라
                    throw new OurException();
                }
            }
        }
      • 우리가 위험한 메서드를 사용한다면, 예외를 handling 하기

        public class StudyException {
            public static void main(String[] args) {
                OurClass ourClass = new OurClass();
        
                try {
                    // 1. 위험한 메소드의 실행을 "시도" 해 봅니다.
                    // "시도" 해보는 코드가 들어가는 블럭입니다.
                    ourClass.thisMethodIsDangerous();
                } catch (OurException e) {
                    // 2. 예외가 발생하면, "잡아서" handling 합니다.
                    // 예외가 발생하는경우 "handling" 하는 코드가 들어가는 블럭입니다.
        						// 즉 try 블럭 내의 구문을 실행하다가 예외가 발생하면
        						// 예외가 발생한 줄에서 바로 코드 실행을 멈추고
        						// 여기 있는 catch 블럭 내의 코드가 실행됩니다.
                    System.out.println(e.getMessage());
                } finally {
                    // 3. 예외의 발생 여부와 상관없이, 실행시켜야 하는 코드가 들어갑니다.
                    // 무조건 실행되는 코드가 들어가는 블럭입니다.
                    System.out.println("우리는 방금 예외를 handling 했습니다!");
                }
        
            }
        }
  • 예외 클래스 이해하기
    • 그전에!! Checked Exception / Unchecked Exception 이해하기
      • Checked Exception : 우리가 사전에 알고 있어서 어떠한 예외 처리를 할 수 있었던 예외 → 예외 처리를 안해놓으면 컴파일 시에 오류가 발생
      • Unchecked Exception : 런타임 때 발생하여서 우리가 예측할 수 없는 예외
    • 어떠한 에러가 어떻게 구현되어 있는지를 공부!!
    • 자바의 Throwable Class
      • 시작은 모든 객체의 원형인 Object 클래스에서 시작
      • 문제 상황을 뜻하는 Throwable 클래스가 Object 클래스를 상속
        • Throwable 클래스의 자식으로 에러 예외 클래스가 있음
          • 에러 예외 클래스는 각각 IOError 클래스, RuntimeException 클래스와 같이 구분 처리
  • Chained Eception(연결된 예외)
    • 예외는 다른 예외를 유발할 수 있다.

    • 예외를 연결하는 이유 : 여러 가지 예외를 하나의 큰 분류의 예외로 묶어서 다루기 위함

    • Checked Exception을 Unchecked Exception으로 포장(Wrapping)하는데 유용하게 사용

    • initCause() : 지정한 예외를 원인 예외로 등록하는 메서드

    • getCause() : 원인 예외 반환 메서드

      → 원인에 대한 tracking이 편하다.

  • 예외처리는 RuntimeException처럼 일괄적으로 처리하기 편한 예외로 바꿔서 던지고 싶은 경우 사용

제네릭

  • 타입을 유연하게 다루는 방법
  • 왜 필요한가?
  • 제네릭은 클래스 또는 메서드에 사용 가능
  • <> 안에 들어가야 할 타입 명시
  • static 멤버에는 사용 불가 → 타입 변수는 인스턴스 변수로 간주

Collection 다시보기

  • List / 배열
    • List
      • 추상적 자료구조
      • 순서를 가지고 있음, 중복을 허용
    • 배열
      • 조회는 빠르나 수정이나 삭제는 느리다.
  • 추상적 자료구조 List
    • List : 인터페이스
      • ArrayList : 클래스
      • LinkedList : 클래스
  • 즉, 상속 개념, 인터페이스 개념, 제네릭 개념을 인지한 상태에서 사용하는 것!!

Wrapper 클래스

  • 추상적인 기능이 필요할 때만 잠깐 객체화 시켜서 쓰고 필요하지 않을 때는 안쓰는 유연한 것
profile
진짜 개발자가 되고 싶다

0개의 댓글