게으른 개발자의 끄적거림

Java throws Exception vs throw new Exception 차이점

끄적잉 2024. 7. 15. 21:57
728x90

 

 Java에서 예외 처리(예외를 던지고 잡는 것)는 중요한 부분입니다. 예외 처리는 프로그램의 실행 중에 발생할 수 있는 오류 상황을 처리하는 방법을 제공하며, 이를 통해 프로그램이 예상치 못한 상황에서도 안정적으로 작동할 수 있게 합니다. Java에서는 예외를 던지고 처리하는 두 가지 주요 방법이 있습니다: `throws` 키워드와 `throw new Exception` 구문입니다. 이 두 가지를 자세히 살펴보겠습니다.

## 1. `throws` 키워드

`throws` 키워드는 메서드 서명(method signature)에서 사용되며, 해당 메서드가 특정 예외를 던질 수 있음을 선언합니다. 이를 통해 메서드를 호출하는 쪽에서 예외를 인지하고 처리하도록 강제합니다. 예를 들어, 다음과 같은 메서드가 있다고 가정해 봅시다.

```java
public void readFile(String fileName) throws IOException {
    // 파일을 읽는 코드
}
```

위 코드에서 `readFile` 메서드는 `IOException`을 던질 수 있음을 선언하고 있습니다. 이는 파일을 읽는 과정에서 파일이 존재하지 않거나 접근 권한이 없을 경우 `IOException`이 발생할 수 있음을 의미합니다.

 


### `throws`의 사용 목적
1. **예외 전파**: 메서드가 직접 예외를 처리하지 않고, 호출자에게 예외 처리를 위임합니다.
2. **문서화**: 메서드가 던질 수 있는 예외를 명시적으로 선언함으로써 메서드 사용자가 어떤 예외를 처리해야 하는지 알 수 있습니다.
3. **코드 클린업**: 메서드 내에서 불필요한 예외 처리 코드를 줄이고, 예외 처리를 메서드를 호출한 쪽에서 일관되게 처리할 수 있습니다.

 

 


### 예제: `throws` 키워드 사용

```java
public class FileReader {
    
    public void readFile(String fileName) throws IOException {
        File file = new File(fileName);
        FileInputStream fis = new FileInputStream(file);
        // 파일 읽기 로직
        fis.close();
    }
}

public class Main {
    public static void main(String[] args) {
        FileReader fileReader = new FileReader();
        try {
            fileReader.readFile("example.txt");
        } catch (IOException e) {
            System.out.println("파일을 읽는 동안 오류가 발생했습니다: " + e.getMessage());
        }
    }
}
```

위 예제에서 `readFile` 메서드는 `IOException`을 던질 수 있으므로 `main` 메서드에서 이 예외를 처리하고 있습니다.

 


## 2. `throw new Exception`

`throw` 키워드는 예외를 명시적으로 던질 때 사용됩니다. 예외 객체를 생성하고 이를 던짐으로써 프로그램의 특정 시점에 오류를 알릴 수 있습니다. 예를 들어, 다음과 같이 사용할 수 있습니다.

```java
public void checkAge(int age) {
    if (age < 18) {
        throw new IllegalArgumentException("나이는 18세 이상이어야 합니다.");
    }
}
```

위 코드에서 `checkAge` 메서드는 나이가 18세 미만인 경우 `IllegalArgumentException` 예외를 던집니다.

### `throw`의 사용 목적
1. **명시적 예외 발생**: 특정 조건에서 의도적으로 예외를 발생시킴으로써 오류 상황을 알립니다.
2. **커스텀 예외 처리**: 개발자가 정의한 특정 상황에서 예외를 던짐으로써 코드의 가독성과 유지보수성을 높입니다.
3. **제어 흐름 관리**: 예외를 통해 코드의 제어 흐름을 관리할 수 있습니다. 예외가 발생하면 해당 예외를 처리하는 블록으로 흐름이 이동합니다.

 


### 예제: `throw` 키워드 사용

```java
public class AgeValidator {
    
    public void validateAge(int age) {
        if (age < 18) {
            throw new IllegalArgumentException("나이는 18세 이상이어야 합니다.");
        }
    }
}

public class Main {
    public static void main(String[] args) {
        AgeValidator validator = new AgeValidator();
        try {
            validator.validateAge(15);
        } catch (IllegalArgumentException e) {
            System.out.println("예외가 발생했습니다: " + e.getMessage());
        }
    }
}
```

위 예제에서 `validateAge` 메서드는 나이가 18세 미만인 경우 `IllegalArgumentException`을 던지고, `main` 메서드에서 이를 처리하고 있습니다.

 


## 3. 체크 예외와 언체크 예외

Java 예외는 크게 두 가지 유형으로 나뉩니다: 체크 예외(Checked Exception)와 언체크 예외(Unchecked Exception).

### 체크 예외 (Checked Exception)

체크 예외는 컴파일 시점에서 예외 처리를 강제하는 예외입니다. 이는 `Exception` 클래스 또는 그 하위 클래스 중에서 `RuntimeException`의 하위 클래스가 아닌 예외를 말합니다. 대표적인 예로 `IOException`, `SQLException` 등이 있습니다. 메서드에서 체크 예외를 던질 경우, 메서드 선언부에 `throws` 키워드를 사용해 해당 예외를 명시해야 합니다.

### 예제: 체크 예외

```java
public void readFile(String fileName) throws IOException {
    FileInputStream fis = new FileInputStream(fileName);
    // 파일 읽기 로직
    fis.close();
}
```

 


### 언체크 예외 (Unchecked Exception)

언체크 예외는 컴파일 시점에서 예외 처리를 강제하지 않는 예외입니다. 이는 `RuntimeException` 클래스 또는 그 하위 클래스인 예외를 말합니다. 대표적인 예로 `NullPointerException`, `ArrayIndexOutOfBoundsException` 등이 있습니다. 메서드에서 언체크 예외를 던질 경우, `throws` 키워드를 사용해 명시할 필요는 없습니다.

 


### 예제: 언체크 예외

```java
public void checkArray(int[] array, int index) {
    if (index >= array.length) {
        throw new ArrayIndexOutOfBoundsException("인덱스가 배열의 범위를 벗어났습니다.");
    }
}
```

## 4. 예외 클래스의 계층 구조

Java의 예외 클래스는 계층 구조를 가집니다. 최상위 클래스는 `Throwable`이며, 이 클래스는 두 가지 주요 하위 클래스를 가집니다: `Exception`과 `Error`입니다.

### Throwable

`Throwable` 클래스는 Java에서 모든 오류 또는 예외의 기본 클래스입니다. 이 클래스는 모든 예외와 오류를 포괄합니다.

### Exception

`Exception` 클래스는 애플리케이션에서 발생할 수 있는 예외 상황을 나타냅니다. 이 클래스는 다시 `CheckedException`과 `UncheckedException`으로 나뉩니다.

### Error

`Error` 클래스는 주로 시스템 레벨의 오류를 나타내며, 애플리케이션에서 처리할 수 없는 심각한 문제를 나타냅니다. 예를 들어, `OutOfMemoryError`는 JVM에서 메모리가 부족할 때 발생하는 오류입니다. 일반적으로 `Error`는 애플리케이션에서 잡거나 처리하지 않습니다.

### 예외 계층 구조

- `Throwable`
  - `Exception`
    - `IOException`
    - `SQLException`
    - `RuntimeException`
      - `NullPointerException`
      - `ArrayIndexOutOfBoundsException`
  - `Error`
    - `OutOfMemoryError`
    - `StackOverflowError`

 


## 5. 커스텀 예외

Java에서는 표준 예외 클래스 외에도 사용자가 정의한 커스텀 예외를 만들 수 있습니다. 이는 특정 비즈니스 로직에서 발생할 수 있는 예외 상황을 보다 명확하게 표현하기 위해 사용됩니다.

### 커스텀 예외 정의

```java
public class InvalidAgeException extends Exception {
    
    public InvalidAgeException(String message) {
        super(message);
    }
}
```

### 커스텀 예외 사용

```java
public class AgeValidator {
    
    public void validateAge(int age) throws InvalidAgeException {
        if (age < 18) {
            throw new InvalidAgeException("나이는 18세 이상이어야 합니다.");
        }
    }
}

public class Main {
    public static void main(String[] args) {
        AgeValidator validator = new AgeValidator();
        try {
            validator.validateAge(15);
        } catch (InvalidAgeException e) {
            System.out.println("예외가 발생했습니다: " + e.getMessage());
        }
    }
}
```

위 예제에서 `InvalidAgeException`은 사용자 정의 예외로, 나이가 18세 미만인 경우 발생합니다. `validateAge` 메서드는 이 예외를 던지고, `main` 메서드에서 이를 처리하고 있습니다.

## 결론

Java에서 예외 처리는 프로그램의 안정성과 신뢰성을 높이는 중요한 기법입니다. `throws` 키워드와 `throw new Exception` 구문을 사용하여 예외를 던지고 처리하는 방법을 이해하는 것은 Java 프로그래머로서 필수적입니다. 체크 예외와 언체크 예외의 차이, 예외 계층 구조, 그리고 커스텀 예

728x90

'게으른 개발자의 끄적거림' 카테고리의 다른 글

(?!) 이란?  (1) 2024.07.24
dll파일이란?  (0) 2024.07.16
클라우드(Cloud)란?  (0) 2024.07.11
서버(server)란? (서버 완벽정리)  (0) 2024.07.10
<%@ include %> <jsp:include> 차이 완벽 정리  (0) 2024.07.09