Java/강의

[📙 Java 문법 종합반] 3-1. 예외(Exception)과 예외처리(try-catch)

가지코딩 2025. 4. 16. 12:29

📙 목차

  1. 예외(Exception)
  2. 예외 전파
  3. 예외 구조와 종류
  4. 실습 과제

🧡 학습 목표

  • Java의 예외처리에 대해서 학습한다.

1. 예외(Exception)

예외(Exception)란?

  • 프로그램 실행 중 예상하지 못한 상황이 발생하는 것
  • 의도적으로 예외를 발생시킬 때는 throw 키워드를 통해 발생시킨다.
  • 예외를 처리하지 않으면 프로그램이 중단될 수 있다.
  • 예외처리(try-catch)를 통해 프로그램이 안정적으로 실행되게 할 수 있다.

 

예외 발생 예제

  • 의도하지 않은 예외
    • 아래 코드에서 10 / 0 연산을 수행하면서 ArithmeticException (산술예외)가 발생한다.
    • 0 으로 나누는 연산은 허용되지 않음으로 프로그램이 비정상적으로 종료된다.
    • 예외를 처리하지 않으면 이후 코드는 실행되지 않는다.
public class Main {
    public static void main(String[] args) {
        System.out.println("프로그램 시작");
        int result = 10 / 0; // ❌ 예외 발생 (ArithmeticException)
        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 를 활용하면 특정 상황에서 예외를 명확하게 정의하고 제어할 수 있다.
public class Main {
    public static void main(String[] args) {
        int age = 10;
        if (age < 18) 
    	    // ✅ 의도적으로 예외를 발생시키는 부분
            throw new IllegalArgumentException("미성년자는 접근할 수 없습니다!");
        }
        System.out.println("....");
    }
}

 


2. 예외 전파

  • 메서드에서 발생한 예외가 해당 메서드 내에서 처리되지 않았을 때, 메서드를 호출한 상위 메서드로 전달되는 과정을 말한다.
  • 예외가 프로그램 시작 지점(main()) 까지 전파되고 끝까지 처리되지 않으면 프로그램이 비정상 종료된다.

3. 예외 구조와 종류

 

RuntimeException - UncheckedException

  • 컴파일러가 예외 처리를 강제하지 않는 예외
  • RuntimeException 을 상속받는 모든 예외를 UncheckedException 이라고 한다.
  • 예외 처리를 하지 않아도 컴파일 오류(빨간줄)가 발생하지 않는다.
  • 처리되지 않은 예외는 계속 프로그램 시작 지점까지 전파된다.
  • 끝내 예외가 처리되지 않으면 프로그램이 비정상적으로 종료된다.
public class ExceptionPractice {
    public void callUncheckedException() {
        if (true) {
            System.out.println("언체크 예외 발생");
            throw new RuntimeException(); // ✅ 예외발생 
        }
    }
}

// Main 클래스
public class Main {
    public static void main(String[] args) {
        // 예외 실습 객체 인스턴스화
        ExceptionPractice exceptionPractice = new ExceptionPractice();

        // ✅ 언체크 예외 호출
        exceptionPractice.callUncheckedException();
        
        // ❌ 예외처리를 해주지 않았기 때문에 프로그램이 종료됩니다.
        System.out.println("이 줄은 실행되지 않습니다."); 
    }
}
// try-catch 로 예외 처리
public class Main {
    public static void main(String[] args) {
        ExceptionPractice exceptionPractice = new ExceptionPractice();
        
        try {
            exceptionPractice.callUncheckedException();
        } catch (RuntimeException e) { 
            System.out.println("언체크 예외 처리");   
            
        } catch (Exception e) {
            System.out.println("체크 예외 처리");
        }

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

 

 

Exception - CheckedException

  • 컴파일러가 예외 처리를 강제하는 예외
  • Exception 클래스를 직접 상속받는 모든 예외를 CheckedException 이라고 한다.
  • 예외 처리를 하지 않으면 “컴파일 오류가 발생한다(코드에 빨간줄)”
  • 반드시 try-catch로 예외를 처리하거나 throws 키워드를 사용해야 한다.
// try-catch 로 예외 처리
public class ExceptionPractice {
    public void callCheckedException() {    
        try { 
            if (true) {
                System.out.println("체크예외 발생");
                throw new Exception();
            }
        } catch (Exception e) {
            System.out.println("예외 처리");
        }
    }
}

// Main 클래스
public class Main {
    public static void main(String[] args) {
        ExceptionPractice exceptionPractice = new ExceptionPractice();

        // ✅ 체크예외 호출
        exceptionPractice.callCheckedException();
    }
}
// throws 키워드로, 예외를 상위로 전파
public class ExceptionPractice {
    public void callCheckedException() throws Exception { 
        if (true) {
            System.out.println("체크예외 발생");
            throw new Exception();
        }
    }
}

// Main 클래스
public class Main {
    public static void main(String[] args) {
        ExceptionPractice exceptionPractice = new ExceptionPractice();

        // try-catch 로 예외처리
        try {
            exceptionPractice.callCheckedException();
        } catch (Exception e) {
            System.out.println("예외처리");
        }
    }
}

4. 실습 과제

로그인 예외처리

  • 사용자로부터 아이디와 비밀번호를 입력받습니다.
  • 아이디가 “admin”, 비밀번호가 “1234” 가 아니면 로그인 실패 예외를 발생시킵니다.
  • 로그인 실패 시 “로그인 실패! 아이디 또는 비밀번호가 잘못되었습니다.” 출력 후 다시 입력을 받습니다.
public class Login {
    public static void LoginCheck(String id, String pw) throws Exception {
        if (!id.equals("admin") || !pw.equals("1234")) {
            throw new Exception("아이디 또는 비밀번호가 잘못되었습니다.\n");
        }
    }
}
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        while (true) {
            try{
                System.out.print("아이디 입력: ");
                String id = in.nextLine();
                System.out.print("비밀번호 입력: ");
                String pw = in.nextLine();

                Login.LoginCheck(id, pw);

                System.out.println("로그인 성공");
                break;

            } catch (Exception e) {
                System.out.println("로그인 실패!");
                System.out.println(e.getMessage());
            }
        }
    }
}