CS 지식

예외처리

이제하네 2024. 9. 8. 22:32

1. 예외(Exception)란?

예외는 프로그램 실행 중 발생하는 예기치 못한 오류 상황을 말합니다. 자바에서 예외는 Throwable 클래스의 하위 클래스로 관리되며, 크게 두 가지로 나뉩니다:

  • Checked Exception: 컴파일 시점에 확인되는 예외로, 반드시 예외 처리를 해주어야 합니다. 예를 들어 파일을 읽거나 쓸 때 발생하는 IOException 등이 해당됩니다.
  • Unchecked Exception: 실행 시점에서 발생하는 예외로, 주로 프로그래머의 실수로 발생하는 예외입니다. 예를 들어 배열의 인덱스가 범위를 벗어났을 때 발생하는 ArrayIndexOutOfBoundsException 등이 있습니다. 이는 명시적인 예외 처리를 강제하지는 않습니다.

2. 예외 처리의 구조

자바에서 예외 처리는 다음과 같은 구조를 따릅니다.

2.1 try 블록

try 블록은 예외가 발생할 가능성이 있는 코드를 감싸는 역할을 합니다. 만약 try 블록 내에서 예외가 발생하면, 해당 예외는 catch 블록으로 전달됩니다.

try {
    // 예외가 발생할 수 있는 코드
}
 
 

2.2 catch 블록

catch 블록은 발생한 예외를 처리하는 곳입니다. 예외 타입에 따라 여러 개의 catch 블록을 작성할 수 있으며, 각 블록에서 다른 종류의 예외를 처리할 수 있습니다.

try {
    // 예외가 발생할 수 있는 코드
} catch (ExceptionType e) {
    // 예외 처리 코드
}

 

예를 들어, 특정 파일을 열 때 발생할 수 있는 FileNotFoundException을 처리하는 코드는 다음과 같습니다:

try {
    File file = new File("test.txt");
    FileReader fr = new FileReader(file);
} catch (FileNotFoundException e) {
    e.printStackTrace();
}

 

2.3 finally 블록

finally 블록은 예외 발생 여부와 상관없이 반드시 실행되는 코드를 작성할 때 사용합니다. 주로 파일, 데이터베이스 연결과 같은 자원을 해제하는 데 사용됩니다.

try {
    // 예외가 발생할 수 있는 코드
} catch (Exception e) {
    // 예외 처리 코드
} finally {
    // 예외 발생 여부와 상관없이 실행
}
 

예를 들어, 파일을 열고 닫는 작업에서 예외 발생 여부와 상관없이 파일을 닫는 코드는 다음과 같습니다.

try {
    File file = new File("test.txt");
    FileReader fr = new FileReader(file);
} catch (FileNotFoundException e) {
    e.printStackTrace();
} finally {
    try {
        if (fr != null) {
            fr.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}
 

2.4 throw 키워드

throw 키워드는 개발자가 직접 예외를 발생시키는 데 사용됩니다. 주로 특정 조건에서 강제로 예외를 던지고자 할 때 사용됩니다.

public void checkAge(int age) {
    if (age < 18) {
        throw new IllegalArgumentException("Age must be at least 18");
    }
}

2.5 throws 키워드

메소드 선언부에 throws 키워드를 사용하여 해당 메소드가 특정 예외를 던질 수 있음을 명시합니다. 호출한 메소드에서 이 예외를 처리해야 합니다.

public void readFile(String fileName) throws FileNotFoundException {
    File file = new File(fileName);
    FileReader fr = new FileReader(file);
}
 

3. 예외의 종류

3.1 Checked Exception

Checked Exception은 컴파일 타임에 반드시 처리해야 하는 예외입니다. 대표적인 Checked Exception은 IOException, SQLException 등이 있습니다. 이러한 예외는 컴파일러에 의해 강제로 예외 처리를 하도록 요구됩니다.

public void readFile(String fileName) throws IOException {
    File file = new File(fileName);
    FileReader fr = new FileReader(file);
}
 

3.2 Unchecked Exception

Unchecked Exception은 런타임에 발생하는 예외로, 예외 처리가 강제되지 않습니다. 주로 프로그래머의 실수로 인해 발생하며, RuntimeException의 하위 클래스들입니다. 예를 들어, NullPointerException, ArrayIndexOutOfBoundsException 등이 있습니다.

public void accessArray() {
    int[] array = new int[5];
    System.out.println(array[5]); // ArrayIndexOutOfBoundsException 발생
}
 

4. 사용자 정의 예외

자바에서는 개발자가 직접 예외 클래스를 정의할 수 있습니다. 보통 애플리케이션에서 발생할 수 있는 특정한 예외 상황을 보다 명확하게 처리하기 위해 사용자 정의 예외를 만듭니다.

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

사용자 정의 예외를 던지는 방법은 다음과 같습니다:

public void checkValue(int value) throws CustomException {
    if (value < 0) {
        throw new CustomException("Value cannot be negative");
    }
}
 

5. 예외 처리의 장점

  1. 프로그램 안정성 유지: 예외 처리를 통해 프로그램이 비정상적으로 종료되지 않도록 할 수 있습니다.
  2. 에러 복구 가능성: 발생한 예외를 처리하여 문제를 해결하거나 복구할 수 있습니다.
  3. 코드 가독성 향상: 예외가 발생할 수 있는 부분과 그 처리를 명확하게 구분할 수 있어 코드의 가독성을 높입니다.
  4. 유지보수 용이성: 잘 정의된 예외 처리는 오류 발생 시 디버깅과 유지보수를 쉽게 할 수 있게 도와줍니다.

자바의 예외 처리는 프로그램의 안정성과 유지보수를 위한 매우 중요한 기능입니다. try, catch, finally, throw, throws 키워드를 적절히 활용하여 예외 발생 시 처리 방안을 마련함으로써 프로그램이 예상치 못한 오류로 중단되는 것을 방지하고, 오류가 발생했을 때도 문제를 처리하거나 복구할 수 있는 기회를 제공합니다.

'CS 지식' 카테고리의 다른 글

스프링과 스프링부트의 차이점  (0) 2024.09.23
TDD  (0) 2024.09.23
동기 ,비동기 처리  (0) 2024.09.02
SOLID 원칙  (0) 2024.09.01
추상 클래스와 인터페이스  (0) 2024.08.25