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 프로그래머로서 필수적입니다.
'게으른 개발자의 끄적거림' 카테고리의 다른 글
(?!) 이란? (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 |