Java 예외 처리

JavaJavaIntermediate
지금 연습하기

소개

이 랩에서는 Java 프로그래밍에서 중요한 개념인 Java 예외 처리 (Exception Handling) 를 탐구합니다. 예외 처리는 코드에서 오류와 예상치 못한 상황을 관리할 수 있게 해줍니다. 예외 처리는 프로그램이 충돌하는 대신 오류를 우아하게 처리하여 프로그램을 더욱 강력하고 사용자 친화적으로 만드는 데 도움이 됩니다.

다음 주제를 다룰 것입니다.

  1. 예외가 무엇이며 왜 중요한지 이해하기
  2. try-catch 블록을 사용하여 예외 처리하기
  3. 사용자 정의 예외 생성 및 발생시키기
  4. 정리 작업을 위한 finally 블록 사용하기
  5. 여러 catch 블록 사용하기

이 랩을 마치면 다양한 오류 시나리오를 처리할 수 있는 Java 프로그램을 작성하여 코드를 더욱 안정적이고 유지 관리하기 쉽게 만들 수 있습니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 90%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

예외 이해하기

예외 처리에 대해 자세히 알아보기 전에, 예외가 무엇이며 왜 중요한지 이해해 봅시다.

  1. 터미널을 열고 프로젝트 디렉토리로 이동합니다.

    cd ~/project
  2. 텍스트 편집기에서 ExceptionDemo.java를 엽니다. 다음과 같은 기본 구조를 볼 수 있습니다.

    public class ExceptionDemo {
        public static void main(String[] args) {
            // 1 단계에서 여기에 코드를 추가합니다.
        }
    }
  3. 예외를 보여주기 위해 이 파일을 수정해 보겠습니다. main 메서드의 내용을 다음 코드로 바꿉니다.

    int[] numbers = {1, 2, 3};
    System.out.println("배열의 네 번째 요소에 접근을 시도합니다...");
    System.out.println(numbers[3]);
    System.out.println("예외로 인해 이 줄은 실행되지 않습니다.");

    이 코드는 세 개의 요소가 있는 배열을 생성한 다음 네 번째 요소 (존재하지 않음) 에 접근하려고 시도합니다.

  4. ExceptionDemo.java 파일을 저장합니다.

  5. 프로그램을 컴파일하고 실행합니다.

    javac ExceptionDemo.java
    java ExceptionDemo

    다음과 유사한 오류 메시지가 표시됩니다.

    배열의 네 번째 요소에 접근을 시도합니다...
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
        at ExceptionDemo.main(ExceptionDemo.java:5)

    이것은 예외의 한 예입니다. ArrayIndexOutOfBoundsException은 존재하지 않는 배열 인덱스에 접근하려고 시도했기 때문에 발생합니다. 프로그램은 계속 실행되는 대신 중지되고 오류에 대한 정보를 제공합니다.

예외는 Java 에서 오류와 특이한 상황을 처리하는 방식입니다. 이를 통해 다음을 수행할 수 있습니다.

  • 코드에서 오류를 식별하고 대응합니다.
  • 오류 처리 코드를 일반 코드와 분리하여 둘 다 이해하기 쉽게 만듭니다.
  • 호출 스택 (call stack) 위로 오류 정보를 전파합니다.

다음 단계에서는 이러한 예외를 처리하여 프로그램을 더욱 강력하게 만드는 방법을 배우겠습니다.

try-catch 블록 사용하기

이제 예외가 무엇인지 이해했으니, try-catch 블록을 사용하여 예외를 처리하는 방법을 배워보겠습니다.

  1. 텍스트 편집기에서 ExceptionDemo.java를 다시 엽니다.

  2. main 메서드의 내용을 다음 코드로 바꿉니다.

    int[] numbers = {1, 2, 3};
    
    try {
        System.out.println("네 번째 요소에 접근을 시도합니다...");
        System.out.println(numbers[3]);
        System.out.println("예외가 발생하면 이 줄은 실행되지 않습니다.");
    } catch (ArrayIndexOutOfBoundsException e) {
        System.out.println("이런! 오류가 발생했습니다: " + e.getMessage());
        System.out.println("배열에는 " + numbers.length + "개의 요소만 있습니다.");
    }
    
    System.out.println("예외를 처리한 후 프로그램이 계속 실행됩니다.");

    이 코드를 자세히 살펴보겠습니다.

    • try 블록에는 예외를 발생시킬 수 있는 코드가 포함되어 있습니다.
    • catch 블록은 처리할 수 있는 예외 유형 (ArrayIndexOutOfBoundsException의 경우) 을 지정하고 해당 예외가 발생할 경우 실행할 코드를 제공합니다.
    • try 블록에서 예외가 발생하면 실행은 즉시 catch 블록으로 이동합니다.
    • catch 블록이 실행된 후 프로그램은 try-catch 구조 다음 줄부터 계속 실행됩니다.
  3. ExceptionDemo.java 파일을 저장합니다.

  4. 프로그램을 컴파일하고 실행합니다.

    javac ExceptionDemo.java
    java ExceptionDemo

    다음과 유사한 출력을 볼 수 있습니다.

    네 번째 요소에 접근을 시도합니다...
    이런! 오류가 발생했습니다: Index 3 out of bounds for length 3
    배열에는 3 개의 요소만 있습니다.
    예외를 처리한 후 프로그램이 계속 실행됩니다.

    이것은 try-catch 블록이 예외를 우아하게 처리할 수 있도록 하는 방법을 보여줍니다. 프로그램은 충돌하는 대신 유용한 메시지를 제공하고 계속 실행됩니다.

사용자 정의 예외 생성 및 발생시키기

때로는 프로그램에서 특정 상황을 처리하기 위해 자체 예외 유형을 만들고 싶을 수 있습니다. 사용자 정의 예외를 생성하고 발생시키는 방법을 살펴보겠습니다.

  1. 텍스트 편집기에서 CustomException.java를 엽니다. 현재 비어 있는 것을 볼 수 있습니다.

  2. 사용자 정의 예외를 정의하기 위해 다음 코드를 추가합니다.

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

    이 코드는 내장된 Exception 클래스를 확장하는 CustomException이라는 새로운 예외 유형을 생성합니다.

  3. 이제 CustomExceptionDemo.java를 엽니다. 다음과 같은 기본 구조를 볼 수 있습니다.

    public class CustomExceptionDemo {
        public static void main(String[] args) {
            // 3 단계에서 여기에 코드를 추가합니다.
        }
    }
  4. 사용자 정의 예외를 사용하도록 이 파일을 수정해 보겠습니다. 내용을 다음 코드로 바꿉니다.

    public class CustomExceptionDemo {
        public static void validateAge(int age) throws CustomException {
            if (age < 0) {
                throw new CustomException("나이는 음수가 될 수 없습니다");
            } else if (age > 120) {
                throw new CustomException("나이가 비현실적으로 보입니다");
            }
            System.out.println("나이가 유효합니다: " + age);
        }
    
        public static void main(String[] args) {
            try {
                System.out.println("나이 25 검증:");
                validateAge(25);
                System.out.println("나이 -5 검증:");
                validateAge(-5);
            } catch (CustomException e) {
                System.out.println("CustomException이 잡혔습니다: " + e.getMessage());
            }
    
            System.out.println("예외 처리 후 프로그램이 계속됩니다");
        }
    }

    이 코드는 다음을 보여줍니다.

    • 사용자 정의 예외를 발생시키는 메서드를 만드는 방법 (validateAge)
    • throw 키워드를 사용하여 예외를 발생시키는 방법
    • 사용자 정의 예외를 잡고 처리하는 방법
  5. CustomException.javaCustomExceptionDemo.java를 모두 저장합니다.

  6. 프로그램을 컴파일하고 실행합니다.

    javac CustomException.java CustomExceptionDemo.java
    java CustomExceptionDemo

    다음과 유사한 출력을 볼 수 있습니다.

    나이 25 검증:
    나이가 유효합니다: 25
    나이 -5 검증:
    CustomException 이 잡혔습니다: 나이는 음수가 될 수 없습니다
    예외 처리 후 프로그램이 계속됩니다

    이 예제는 사용자 정의 예외를 사용하여 프로그램에서 특정 오류 조건을 처리하는 방법을 보여줍니다. 이를 통해 더 의미 있는 오류 메시지를 만들고 다양한 유형의 오류를 다양한 방식으로 처리할 수 있습니다.

finally 블록 사용하기

finally 블록은 예외가 발생했는지 여부에 관계없이 실행되어야 하는 코드를 실행하는 데 사용됩니다. 일반적으로 정리 작업에 사용됩니다.

  1. FinallyDemo.java를 엽니다. 다음과 같은 기본 구조를 볼 수 있습니다.

    public class FinallyDemo {
        public static void main(String[] args) {
            // 4 단계에서 여기에 코드를 추가합니다.
        }
    }
  2. main 메서드의 내용을 다음 코드로 바꿉니다.

    try {
        System.out.println("0 으로 나누기를 시도합니다...");
        int result = 10 / 0;
        System.out.println("이 줄은 실행되지 않습니다.");
    } catch (ArithmeticException e) {
        System.out.println("예외를 잡았습니다: " + e.getMessage());
    } finally {
        System.out.println("이 블록은 예외 발생 여부에 관계없이 항상 실행됩니다.");
    }
    
    System.out.println("try-catch-finally 블록 이후 프로그램이 계속됩니다.");

    이 코드는 다음을 보여줍니다.

    • 0 으로 나누기를 시도하는 try 블록 (이는 ArithmeticException을 발생시킵니다)
    • 예외를 처리하는 catch 블록
    • 예외 발생 여부에 관계없이 실행될 finally 블록
  3. FinallyDemo.java 파일을 저장합니다.

  4. 프로그램을 컴파일하고 실행합니다.

    javac FinallyDemo.java
    java FinallyDemo

    다음과 유사한 출력을 볼 수 있습니다.

    0 으로 나누기를 시도합니다...
    예외를 잡았습니다: / by zero
    이 블록은 예외 발생 여부에 관계없이 항상 실행됩니다.
    try-catch-finally 블록 이후 프로그램이 계속됩니다.

finally 블록은 파일 닫기 또는 네트워크 연결과 같이 예외가 발생했는지 여부에 관계없이 발생해야 하는 정리 작업에 유용합니다.

여러 catch 블록 사용하기

때로는 동일한 코드 블록에서 다양한 유형의 예외가 발생할 수 있습니다. Java 는 여러 catch 블록을 사용하여 다양한 예외 유형을 처리할 수 있도록 합니다.

  1. MultipleCatchDemo.java를 엽니다. 다음과 같은 기본 구조를 볼 수 있습니다.

    public class MultipleCatchDemo {
        public static void main(String[] args) {
            // 5 단계에서 여기에 코드를 추가합니다.
        }
    }
  2. main 메서드의 내용을 다음 코드로 바꿉니다.

    try {
        int[] numbers = {1, 2, 3};
        int index = 4; // 이것은 ArrayIndexOutOfBoundsException 을 발생시킵니다.
        int result = numbers[index] / 0; // 이 줄은 도달하면 ArithmeticException 을 발생시킵니다.
        System.out.println("이 줄은 실행되지 않습니다.");
    } catch (ArithmeticException e) {
        System.out.println("ArithmeticException 을 잡았습니다: " + e.getMessage());
    } catch (ArrayIndexOutOfBoundsException e) {
        System.out.println("ArrayIndexOutOfBoundsException 을 잡았습니다: " + e.getMessage());
    } catch (Exception e) {
        System.out.println("일반적인 Exception 을 잡았습니다: " + e.getMessage());
    }
    
    System.out.println("예외 처리 후 프로그램이 계속됩니다.");

    이 코드는 다음을 보여줍니다.

    • 다양한 유형의 예외를 처리하기 위한 여러 catch 블록
    • catch 블록의 순서가 중요합니다: 더 구체적인 예외는 더 일반적인 예외보다 먼저 잡아야 합니다.
  3. MultipleCatchDemo.java 파일을 저장합니다.

  4. 프로그램을 컴파일하고 실행합니다.

    javac MultipleCatchDemo.java
    java MultipleCatchDemo

    다음과 유사한 출력을 볼 수 있습니다.

    ArrayIndexOutOfBoundsException 을 잡았습니다: Index 4 out of bounds for length 3
    예외 처리 후 프로그램이 계속됩니다.

    코드에 두 가지 잠재적인 예외 (0 으로 나누기 및 배열 인덱스 범위를 벗어남) 가 있지만, ArrayIndexOutOfBoundsException이 먼저 발생하기 때문에 해당 예외만 잡힙니다. index 변수를 2 로 변경하면 대신 ArithmeticException을 볼 수 있습니다.

요약

이 랩에서는 견고하고 신뢰할 수 있는 Java 프로그램을 작성하는 데 중요한 측면인 Java 예외 처리 (Exception Handling) 에 대해 살펴보았습니다. 우리는 몇 가지 중요한 개념을 다루었습니다.

  1. 예외 이해: 예외가 무엇인지, 그리고 예외가 코드에서 오류를 관리하는 데 어떻게 도움이 되는지 배웠습니다.
  2. try-catch 블록 사용: try-catch 블록을 사용하여 예외를 적절하게 처리하는 방법을 보았습니다. 이를 통해 오류가 발생하더라도 프로그램이 계속 실행될 수 있습니다.
  3. 사용자 정의 예외 생성 및 발생시키기: 자체 예외 유형을 만들고 특정 오류 조건을 알리기 위해 예외를 발생시키는 방법을 배웠습니다.
  4. finally 블록 사용: 예외가 발생했는지 여부에 관계없이 실행되어야 하는 코드를 실행하기 위해 finally 블록을 사용하는 방법을 배웠습니다. 이는 정리 작업에 유용합니다.
  5. 여러 catch 블록 사용: 여러 catch 블록을 사용하여 다양한 유형의 예외를 처리하는 방법을 보았으며, 이를 통해 보다 구체적인 오류 처리가 가능합니다.

이러한 예외 처리 기술은 Java 프로그래머의 필수 도구입니다. 이를 통해 예상치 못한 상황을 적절하게 처리할 수 있는 더 탄력적인 코드를 작성하여 프로그램의 전반적인 신뢰성과 사용자 경험을 향상시킬 수 있습니다.

Java 여정을 계속 진행하면서 효과적인 예외 처리가 전문적인 품질의 코드를 작성하는 데 핵심적인 부분임을 알게 될 것입니다. 프로그램에서 이러한 기술을 연습하면 숙련된 Java 개발자가 되는 데 한 걸음 더 다가갈 수 있습니다!

일부 개념이 어렵게 느껴지더라도 괜찮습니다. 예외 처리는 특히 초보자에게는 복잡할 수 있습니다. 계속 연습하고, 이 랩을 다시 검토하거나 더 많은 설명이 필요한 경우 추가 자료를 주저하지 말고 찾아보세요. 예외를 더 많이 사용할수록 코딩 과정에서 더욱 자연스러워질 것입니다.

Morty Proxy This is a proxified and sanitized view of the page, visit original site.