1️⃣3️⃣ 예외 처리 – 프로그램을 안전하게 보호하자! 🛡️🚀

🎬 상상해봐

너는 게임 캐릭터를 다루는 프로그램을 만들고 있어.
사용자가 잘못된 입력을 했을 때, 프로그램이 멈추지 않고 오류를 처리할 수 있어야 해.
그럼 예외 처리를 사용하면, 에러를 안전하게 처리하고, 프로그램이 중단되지 않도록 만들 수 있어!


⚠️ 1. 예외란 무엇인가?

예외프로그램 실행 중 발생할 수 있는 오류야.
예를 들어, 사용자가 잘못된 입력을 했거나, 파일이 존재하지 않는 경우 등에서 예외가 발생할 수 있어.
이때 예외 처리를 하면, 프로그램이 갑자기 종료되지 않게 할 수 있어!

public class Main {

    public static void main(String[] args) {
        int[] numbers = {1, 2, 3};
        System.out.println(numbers[5]); // 예외 발생! 배열의 범위를 넘었어!
    }
}

위 코드는 배열의 범위를 넘어서 접근하려 했기 때문에 배열 인덱스 초과 예외가 발생해.
이때 예외 처리를 사용하면 프로그램이 중단되지 않고 계속 진행할 수 있어!


🛠️ 2. 예외 처리 – try-catch 사용법

예외 처리를 하려면 try-catch 블록을 사용해.
try 블록 안에 예외가 발생할 수 있는 코드를 넣고,
catch 블록에서 예외가 발생했을 때의 처리 방법을 정의하는 거야.

public class Main {

	public static void main(String[] args) {
    
		try {
			int[] numbers = {1, 2, 3};
			System.out.println(numbers[5]); // 예외 발생!
		} catch (ArrayIndexOutOfBoundsException e) {
			System.out.println("배열의 범위를 초과했습니다!");
		}
	}
}

try 블록 안에서 예외가 발생하면, 해당 예외는 catch 블록으로 넘어가서 처리돼.
이렇게 하면 프로그램이 중단되지 않고 예외를 처리할 수 있어!


🔄 3. 예외 클래스 – 다양한 예외 처리

catch 블록에서는 발생할 수 있는 여러 종류의 예외를 처리할 수 있어.
예를 들어, 배열 인덱스 초과 예외숫자 형변환 예외 등을 각각 다르게 처리할 수 있어!

public class Main {

	public static void main(String[] args) {
    
		try {
			int[] numbers = {1, 2, 3};
			System.out.println(numbers[5]); // 예외 발생!
			int num = Integer.parseInt("ABC"); // 예외 발생!
		} catch (ArrayIndexOutOfBoundsException e) {
			System.out.println("배열의 범위를 초과했습니다!");
		} catch (NumberFormatException e) {
			System.out.println("숫자 형식이 잘못되었습니다!");
		}
	}
}

catch 블록에서 예외 타입을 다르게 지정하면, 발생한 예외에 맞는 처리를 할 수 있어!
예를 들어, 배열 인덱스 초과 예외와 숫자 형식 예외를 각각 처리할 수 있지!


🧠 4. 예외 처리의 중요성

  • 안정적인 프로그램: 예외를 처리하면 프로그램이 예상치 못한 오류로 중단되지 않아.
  • 에러 메시지 출력: 예외가 발생했을 때, 어떤 오류가 발생했는지 메시지로 알리기 때문에, 문제를 더 쉽게 찾을 수 있어.
  • 유저 경험 개선: 프로그램이 갑자기 멈추지 않고 우아하게 오류를 처리하면 사용자가 불편함을 덜 느끼게 돼!

🔧 5. 예외 던지기 (throw)

때로는 예외를 강제로 발생시켜야 할 때도 있어.
이때는 throw를 사용해 예외를 던져줄 수 있어.

public class Main {

	public static void main(String[] args) {

		try {
			checkAge(15);
		} catch (IllegalArgumentException e) {
			System.out.println("나이가 너무 어립니다!");
		}
	}

	public static void checkAge(int age) {
		if (age < 18) {
			throw new IllegalArgumentException("나이가 18세 이상이어야 합니다.");
		} else {
			System.out.println("나이는 적당합니다.");
		}
	}
}

위 코드는 checkAge 메서드에서 나이가 18세 미만이면 throw로 예외를 던져서 처리하게 돼.
이렇게 하면 특정 조건에 맞지 않을 때 예외를 던져 프로그램 흐름을 제어할 수 있어!


🧩 6. 예외 전파하기 (throws)

메서드에서 발생한 예외를 그 메서드를 호출한 곳으로 넘기기 위해서는 throws 키워드를 사용해.

public class Main {

	public static void main(String[] args) throws Exception {
		readFile("non_existent_file.txt");
	}

	public static void readFile(String fileName) throws Exception {
		// 파일을 읽는 과정에서 예외가 발생할 수 있어
		throw new Exception("파일을 찾을 수 없습니다!");
	}
}

throws는 예외가 발생할 가능성이 있는 메서드에 사용해.
이 예외는 메서드를 호출한 곳으로 전파되며, 그곳에서 처리해야 해.


🧠 정리 타임

개념의미예시
예외 처리 프로그램에서 발생할 수 있는 오류를 처리하는 기술 try-catch 블록 사용
try-catch 예외가 발생할 수 있는 코드를 try에 넣고, 예외를 catch에서 처리 catch (ArrayIndexOutOfBoundsException e)
throw 예외를 강제로 던질 때 사용 throw new IllegalArgumentException()
throws 메서드에서 발생한 예외를 호출한 곳으로 전파 public void readFile(String fileName) throws Exception

🎮 실전 미션 – 예외 처리로 안전한 계산기 만들기

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		try {
			Scanner scanner = new Scanner(System.in);
			System.out.print("숫자를 입력하세요: ");
			int num1 = Integer.parseInt(scanner.nextLine());
			System.out.print("나눌 숫자를 입력하세요: ");
			int num2 = Integer.parseInt(scanner.nextLine());
			System.out.println("결과: " + (num1 / num2));
		} catch (ArithmeticException e) {
			System.out.println("0으로 나눌 수 없습니다!");
		} catch (NumberFormatException e) {
			System.out.println("숫자만 입력해주세요!");
		} catch (Exception e) {
			System.out.println("알 수 없는 오류가 발생했습니다!");
		}
	}
}

✨ 마무리 요약

예외 처리를 사용하면, 오류가 발생할 때 프로그램이 중단되지 않고 우아하게 처리할 수 있어.
이제 프로그램에서 발생할 수 있는 예외적인 상황안전하게 처리할 수 있게 되었어!


예외 처리를 배우고 나면, 더 이상 오류로 인한 충돌을 두려워할 필요가 없어!
다음에는 더 많은 예외 처리 기법을 다루면서, 프로그램의 안전성을 높여보자!