John's Code Journey

[TIL] 예외처리(Exception) 본문

Today I Learned/스파르타 내일배움캠프

[TIL] 예외처리(Exception)

Johnnnn 2025. 2. 26. 23:50
728x90

8일차 오늘은 자바 3주차 강의를 수강했다. 

내용이 어렵고 2주차 자바를 복습하느라 3주차를 다 듣지는 못했다.

 

예외(Exception)란?

  • 예외는 프로그램 실행 중 예상하지 못한 상황이 발생하는 것을 의미합니다.→ 대표적인 산술 예외: 10 / 0 (0 으로 나누기)
  • → 커피 쏟기
  • 의도적으로 예외를 발생시킬 때는 throw 키워드를 통해 발생시킵니다.
  • 예외를 처리하지 않으면 프로그램이 중단될 수 있습니다.
  • 그래서 예외처리(try-catch)를 통해 프로그램이 안정적으로 실행되게 할 수 있습니다.

의도하지 않은 예외

  • 아래 코드에서 10 / 0 연산을 수행하면서 ArithmeticException (산술예외)가 발생합니다.
  • 0 으로 나누는 연산은 허용되지 않음으로 프로그램이 비정상적으로 종료됩니다.
  • 예외를 처리하지 않으면 이후 코드는 실행되지 않습니다.
public class Main {
    public static void main(String[] args) {
        System.out.println("프로그램 시작");
        int result = 10 / 0; //  예외 발생 
        System.out.println("이 문장은 실행되지 않음");
    }
}

 

Exception in thread "main" java.lang.ArithmeticException: / by zero
	at chapter3.exception.Main.main(Main.java:8)

Process finished with exit code 1

 

의도적인 예외 - throw

  • 특정 조건에서 의도적으로 예외를 발생시킬 수도 있습니다.
  • 비즈니스 규칙을 위반한 경우(미성년자접근)
  • 아래 코드에서 age < 18 조건을 만족하면 IllegalArgumentException 을 발생시킵니다.
  • throw 를 활용하면 특정 상황에서 예외를 명확하게 정의하고 제어할 수 있습니다.
int age = 10;
        if(age < 18) {
            throw new IllegalArgumentException("미성년자는 접근할 수 없습니다.");
            // age가 18보다 작은게 맞기에 if문을 통과해서 throw에 접근했음
        }
        System.out.println("프로그램 종료");

 

예외 구조와 종류

  • RuntimeException - UncheckedException
    • RuntimeException 을 상속받는 모든 예외를 UncheckedException 이라고 합니다.
    • 예외처리를 컴파일러가 확인하지 않습니다.
  • Exception - CheckedException
    • Exception 클래스를 직접 상속받는 모든 예외를 CheckedException 이라고합니다. RuntimeException과 RuntimeException 을 상속받은 예외는 제외합니다.
    • 예외처리를 컴파일러가 확인해 줍니다.

예외구조

RuntimeException - UncheckedException

  • 컴파일러가 예외 처리를 강제하지 않는 예외입니다.
  • 예외 처리를 하지 않아도 컴파일 오류(빨간 줄) 가 발생하지 않습니다.
  • 처리되지 않은 예외는 계속 프로그램 시작 지점까지 전파됩니다.
  • 끝내 예외가 처리되지 않으면 프로그램이 비정상적으로 종료됩니다.
  • RuntimeException 을 상속받는 모든 예외를 UncheckedException 이라고 합니다.

Exception - CheckedException

  • Exception 클래스를 직접 상속받는 모든 예외를 CheckedException 이라고 합니다.
  • RuntimeException 을 상속받는 예외는 제외.
  • 컴파일러가 예외 처리를 강제하는 예외입니다.
  • 예외 처리를 하지 않으면 “컴파일 오류가 발생한다(코드에 빨간줄)” 라고 이해하시면 쉽습니다.
  • 반드시 try-catch로 예외를 처리하거나 throws 키워드를 사용해야 합니다. → throws 로 예외 처리의 책임을 호출자에게 전가할 수 있습니다

정리

  • 예외가 발생하고 처리되지 않으면 프로그램이 비정상적으로 종료될 수 있기 때문에 꼭 예외 처리는 필수입니다.
  • CheckedException 은 컴파일러를 통해 개발자에게 반드시 처리해야 하는 예외를 알려줄 수 있습니다.
  • UncheckedException 은 개발자가 충분히 예측하고 방지할 수 있는 경우 사용합니다.
  • → 숫자를 0으로 나누는 오류 등은 코드 검토로 충분히 예방 가능합니다. → 이런 예외 처리까지 CheckedException 으로 처리하도록 강제한다면 모든 예외 상황을 처리해야 하는 답답한 상황이 벌어져 개발 생산성이 저하되고 불필요한 코드가 많아질 수 있습니다.
package chapter3.exception;

public class ExceptionPractice {

    // 1. 언체크 예외 호출 예시
//    public void callUncheckedException() {
//        try {
//            if (true) {
//                System.out.println("언체크 예외 발생");
//                throw new RuntimeException();  // 언체크 예외는 try-catch로 처리해야 함
//            }
//        } catch (RuntimeException e) {
//            System.out.println("언체크 예외 처리");
//        }
//    }

    // 2. 체크 예외 호출 예시
    public void callCheckedException() throws Exception {
        //                        여기에 throws를 쓰면 메서드를 호출한 상위메서드에서 처리할거라는 뜻
        if (true) {
                System.out.println("체크 예외 발생");
                throw new Exception();
        }
//        try {
//            if (true) {
//                System.out.println("체크 예외 발생");
//                throw new Exception();  // 체크 예외는 반드시 try-catch로 처리해야 함
//            }
//        } catch (Exception e) {
//            System.out.println("체크 예외 처리");
//        }
    }

}

 

package chapter3.exception;

public class Main {
    public static void main(String[] args) {

        // 1. 의도하지 않은 예외
//        System.out.println("시작");
//        int ret = 10 / 0;
//        System.out.println("ret = " + ret);
//        System.out.println("프로그램 종료");

        // 2. 의도적인 예외 - throw
//        int age = 10;
//        if(age < 18) {
//            throw new IllegalArgumentException("미성년자는 접근할 수 없습니다.");
//            // age가 18보다 작은게 맞기에 if문을 통과해서 throw에 접근했음
//        }
//        System.out.println("프로그램 종료");

        // 3. 언체크 예외 호출
        ExceptionPractice exceptionPractice = new ExceptionPractice();
//        try {
//            exceptionPractice.callUnckeckedException();
//        } catch (Exception e) {
//            System.out.println("언체크 예외 처리");
//        }

        // 4. 체크 예외 호출
        try {
            exceptionPractice.callCheckedException();
        }catch (Exception e) {
            System.out.println("체크 예외 처리");
        }

        System.out.println("프로그램 종료");
    }
}

'Today I Learned > 스파르타 내일배움캠프' 카테고리의 다른 글

[TIL] JAVA 컬렉션 프레임워크  (1) 2025.03.10
[TIL] 250305 계산기 과제 리뷰  (1) 2025.03.05
[TIL] 250225  (1) 2025.02.25
[TIL] 250224  (1) 2025.02.24
[TIL] 내일배움캠프 250221  (0) 2025.02.21