공부 기록/Java with ChatGPT

[Java/ChatGPT] Day 13: 사용자 정의 예외 + throw, throws

dev.jelee 2025. 6. 21. 17:54

[ 학습 목표 ]

  1. 자바에서 예외를 직접 정의하고 처리하는 방법을 이해한다.
  2. throw, throws 키워드의 역할과 차이점을 명확히 구분한다.
  3. 예외 상황을 만들고 처리하는 실습을 통해 안정적인 코드를 작성한다.

[ 이론 ]

1. 사용자 정의 예외란?

  • 자바가 제공하는 기본 예외 클래스 외에도, 직접 새로운 예외 클래스를 정의해서 프로그램에 맞는 예외 상황을 만들 수 있다.

 

2. 사용자 정의 예외 생성 방법

public class MyException extends Exception {
	public MyException(String message) {
    	super(message); // 부모(Exception) 클래스 생성자 호출
    }
}

 

3. thorw 키워드

  • 예외 객체를 강제로 발생시킬 때 사용
throw new MyException("오류 메시지");

 

4. throws 키워드

  • 메서드 선언부에서 "이 메서드는 예외를 던질 수 있다"고 알리는 키워드
void someMethod() throws MyException {
	// ...
}

 

5. 예제: 나이 검사 예외 만들기

📄 사용자 정의 예외 클래스

public class AgeException extends Exception {
	public AgeException(String message) {
    	super(message);
    }
}

 

📄 사용 예시

public class AgeChecker {
	public static void checkAge(int age) throws AgeException {
    	if (age < 0) {
        	throw new AgeException("나이는 음수가 될 수 없습니다.");
        } else {
        	System.out.println("나이: " + age);
        }
    }
    
    public static void main(String[] args) {
    	try {
        	checkAge(-5); // 여기서 예외 발생
        } catch (AgeException e) {
        	System.out.println("예외 발생: " + e.getMessage());
        }
    }
}

 

6. 요약

키워드 의미
throw 예외를 "직접 발생"시킬 때 사용
throws 예외가 "발생할 수 있음을 알리는" 선언
사용자 정의 예외 Exception 또는 RuntimeException을 상속해서 생성

[ 실습 ]

💪 실습 문제

사용자로부터 점수를 입력받아,

0보다 작거나 100보다 크면 ScoreException 예외 발생
정상 범위면 “점수는 정상입니다.” 출력
추가 팁: Scanner, try-catch, 사용자 정의 예외 사용

 

▼ 내가 푼 실습 문제

public class ScoreException extends Exception {
  public ScoreException(String message) {
    super(message);
  }
}
import java.util.Scanner;

public class ScoreChecker {
  public static void checkScore(int score) throws ScoreException {
    if (score < 0 || score > 100) {
      throw new ScoreException("0보다 작거나 100보다 커야 합니다.");
    } else {
      System.out.println("점수는 정상입니다.");
    }
  }

  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    
    try {
      int score = sc.nextInt();
      checkScore(score);
    } catch (ScoreException e) {
      System.out.println("예외 발생: " + e.getMessage());
    } finally {
      sc.close();
    }
  }
}

[ 메모 ]

  • 사용자 정의 예외는 만들려면 extends 키워드를 사용해서 Exception 내장 클래스를 상속 받아야 한다.
    • class 예외명 extends Exception { .. }
  • { } 중괄호 안에는 내가 생성한 예외명과 동일한 생성자를 생성하는데 매개변수는 String타입의 message를 작성.
    • public 예외명 (String message) { ... }
  • { ... } 여기 안에는 super키워드를 사용하여 부모 클래스인 Exception의 생성자를 호출하도록 한다.
    • super(message);
  • throw는 직접 예외를 발생 시킬 때 사용하고, throws는 메서드에 예외가 발생될 수 있음을 알리는 선언이다.
    • throw new 예외명("예외메시지")
    • public static void 메서드명() throws 예외명 { ... }
  • 사용자 정의 예외는 Exception 또는 RuntimeExeption을 상속해서 생성할 수 있다.