728x90
예외 처리 (Exception Handling)
예외(Exception)란 무엇인가?
프로그램 실행 중에 발생할 수 있는 비정상적인 상황을 의미한다. 예를 들어, 배열의 인덱스를 초과해서 접근하려는 시도, 파일이 없을 때 파일을 읽으려는 시도 등이 예외 상황에 해당한다.
- Checked Exception: 컴파일 시점에 발생 가능성을 컴파일러가 확인해야 하는 예외. 예: IOException, SQLException.
- Unchecked Exception: 런타임에서만 확인되는 예외. 예: NullPointerException, ArrayIndexOutOfBoundsException.
예외처리가 java에서 중요한 이유는 아래와 같다.
- 프로그램 안정성
- 예외를 처리하지 않으면 프로그램이 비정상적으로 종료될 수 있다.
- 사용자 경험 개선
- 사용자에게 친숙한 오류 메시지나 대체 작업을 제공할 수 있다.
- 디버깅 용이성
- 적절한 예외 처리는 문제가 발생한 원인을 추적하고 해결하기 쉽게 만든다.
예외 처리의 구조
try-catch-finally 블록의 사용
- try 블록: 예외가 발생할 가능성이 있는 코드를 감싸는 블록이다.
- catch 블록: try에서 발생한 예외를 처리한다.
- finally 블록: 예외 발생 여부와 관계없이 항상 실행되는 블록이다. 주로 리소스 정리 용도로 사용한다.
public class ExceptionExample {
public static void main(String[] args) {
try {
int result = 10 / 0; // 예외 발생
} catch (ArithmeticException e) {
System.out.println("예외 발생: " + e.getMessage());
} finally {
System.out.println("프로그램 종료");
}
}
}
/* 출력
예외 발생: / by zero
프로그램 종료
*/
throw와 throws 키워드의 차이
- throw: 특정 예외를 명시적으로 발생시킬 때 사용한다.
if (value < 0) {
throw new IllegalArgumentException("음수는 허용되지 않습니다.");
}
- throws: 메서드가 호출자에게 예외를 전달할 수 있음을 선언한다.
public void readFile() throws IOException { // IOException 발생 가능 }
예외 처리의 종류
체크 예외와 언체크 예외의 차이
- Checked Exception:
- 컴파일러가 예외 처리를 강제한다.
- 예: IOException, SQLException.
- 사용 시점: 외부 리소스(파일, 네트워크 등)와 상호작용 시.
- Unchecked Exception:
- 컴파일러가 처리 여부를 확인하지 않는다.
- 예: NullPointerException, ArithmeticException.
- 사용 시점: 주로 프로그래머의 실수로 발생.
자주 발생하는 예외 종류
NullPointerException: 객체가 null인 상태에서 메서드나 필드에 접근하려 할 때 발생한다.
String text = null;
System.out.println(text.length()); // 예외 발생
IOException: 입출력 작업 중 문제가 발생할 때 발생한다.
BufferedReader br = new BufferedReader(new FileReader("nonexistent.txt")); // 예외 발생
ArrayIndexOutOfBoundsException: 배열의 인덱스를 초과하려고 할 때 발생한다.
int[] numbers = {1, 2, 3};
System.out.println(numbers[3]); // 예외 발생
질문
Error와 Exception의 차이는 무엇인가요?
- Error는 실행 중 일어날 수 있는 애플리케이션에서 복구할 수 없는 심각한 문제를 말합니다.
- 컴파일 시점에 체크할 수 없고, 오류가 발생하면 프로그램은 비정상 종료되며 개발자가 직접 처리하거나 예측하기 어려운 상황 UncheckedException에 속합니다.
- 런타임에서 실행 시 발생되며 전부 예측 불가능한 Unchecked Error에 속한다.
- ex) OutOfMemoryError, StackOverflowError, VirtualMachineError.
- Exception:
- Exception은 애플리케이션에서 발생하는 문제로, 개발자가 적절히 처리하여 복구할 수 있습니다.
- 일반적인 실행 오류를 나타내며, 명시적으로 예외 처리를 구현할 수 있습니다.
- ex) IOException, NullPointerException, ArithmeticException.
Checked Exception과 Unchecked Exception의 차이점은 무엇인가요?
- Checked Exception:
- 컴파일 타임에 체크되는 예외로, 반드시 예외 처리를 해야 합니다.
- 예외 처리(try-catch 또는 throws)가 없으면 컴파일 오류가 발생합니다.
- 예: IOException, SQLException.
- 장점: 예외 처리가 강제되므로 안정성이 높습니다.
- 단점: 코드를 복잡하게 만들 수 있습니다.
- Unchecked Exception:
- 런타임에 발생하며, 예외 처리가 강제되지 않습니다.
- RuntimeException을 상속받은 클래스들이 해당됩니다.
- 예: NullPointerException, IndexOutOfBoundsException.
- 장점: 예외 처리가 강제되지 않아 코드가 간결해집니다.
- 단점: 예외 처리가 누락될 위험이 있습니다.
커스텀 예외(Custom Exception)를 설계해야 하는 이유와 방법은 무엇인가요?
이유
- 기존 예외 클래스는 특정 비즈니스 로직에 적합하지 않을 수 있습니다.
- 사용자 정의 예외를 통해 문제를 더 구체적으로 설명할 수 있습니다.
- 코드의 가독성과 유지보수성을 높여줍니다.
- 특정 도메인에 특화된 예외 처리를 명확히 할 수 있습니다.
방법
- Exception 또는 RuntimeException을 상속받습니다.
- 예외 메시지를 전달할 생성자를 작성합니다.
- 필요에 따라 추가적인 데이터를 포함하는 필드를 정의합니다.
- 예외 로깅과 디버깅을 용이하게 하기 위해 super 메서드와 연동합니다.
이외
- 자바에서 예외 처리 방법 (try, catch, throw, throws, finally)
try: 예외가 발생할 가능성이 있는 코드를 작성합니다.
catch: 발생한 예외를 잡아 처리합니다.
throw: 명시적으로 예외를 발생시킬 때 사용합니다.
throws: 메서드에서 예외를 호출자에게 전달할 때 선언합니다.
finally: 예외 발생 여부와 상관없이 항상 실행되는 블록입니다.
- 자바가 제공하는 예외 계층 구조
Throwable
├── Error (복구 불가)
│ ├── OutOfMemoryError
│ ├── StackOverflowError
│ └── VirtualMachineError
└── Exception (복구 가능)
├── IOException (Checked)
├── SQLException (Checked)
└── RuntimeException (Unchecked)
├── NullPointerException
├── ArrayIndexOutOfBoundsException
└── ArithmeticException
- RuntimeException과 RuntimeException가 아닌 것의 차이는?
RuntimeException:런타임 시점에서 발생하며, 명시적 예외 처리가 강제되지 않습니다.예: IllegalArgumentException, NullPointerException.주로 프로그래밍 실수로 인해 발생합니다.
RuntimeException가 아닌 것 (Checked Exception):컴파일 타임에 처리 여부를 검사하며, 예외 처리가 강제됩니다.예: IOException, SQLException.주로 외부 리소스(파일, 네트워크 등)와 관련된 오류입니다.
728x90
반응형
'프로그래밍 언어 > Java' 카테고리의 다른 글
자바의 장단점을 알아보자. (0) | 2024.11.19 |
---|---|
캡슐화와 은닉화의 차이 - 객체지향 프로그래밍(OOP)의 기본 원칙 (0) | 2024.11.19 |
자바 람다와 스트림 – 효율적인 코드 작성 (2) | 2024.11.09 |
자바 컬렉션 프레임워크 – 자바에서 데이터를 다루는 방법 (0) | 2024.11.09 |
제네릭 타입 (Generic Types) – 자바에서 타입 안정성을 확보하다 (0) | 2024.11.08 |