자바의 정석[기초편]으로 공부한 내용을 정리한 글입니다.
자바에는 기본적으로 많은 예외 클래스(NullPointerException, IOException 등)가 정의되어 있지만,
프로그래머가 자신의 상황에 맞는 특별한 예외를 직접 만들 수 있습니다.
이렇게 만든 예외 클래스를 사용자 정의 예외라고 합니다.
사용자 정의 예외 만드는 방법
기본적으로 다음 두 가지 중 하나를 상속받아 만듭니다:
- Exception 클래스를 상속 → checked 예외
- RuntimeException 클래스를 상속 → unchecked 예외
기본 사용자 정의 예외 클래스
class MyException extends Exception {
MyException(String msg) {
super(msg); // 부모(Exception)의 생성자 호출 → 메시지 저장
}
}
- Exception을 상속받았기 때문에 checked 예외입니다.
- 생성자에서 메시지를 받아 부모 클래스의 생성자에게 전달합니다.
- 이렇게 하면 getMessage()로 나중에 이 메시지를 꺼낼 수 있습니다.
오류 코드도 함께 저장하는 예외 클래스
class MyException extends Exception {
private final int ERR_CODE;
// 메시지와 에러 코드 받는 생성자
MyException(String msg, int errCode) {
super(msg); // 메시지는 Exception에 저장
ERR_CODE = errCode; // 에러코드는 MyException에 저장
}
// 메시지만 받는 생성자 → 에러코드는 기본값 100
MyException(String msg) {
this(msg, 100);
}
// 에러 코드를 꺼내는 메서드
public int getErrCode() {
return ERR_CODE;
}
}
📌 여기서 중요한 점
- 생성자 오버로딩으로 메시지만 받을 수도 있고, 메시지 + 코드 둘 다 받을 수도 있게 함
- getMessage()는 Exception 클래스에 정의되어 있고,
- getErrCode()는 사용자가 직접 만든 메서드
이렇게 하면 catch 블록 안에서 getMessage()와 getErrCode()를 함께 사용해서
예외의 내용을 더 풍부하게 처리할 수 있습니다.
실전에서의 장점
try {
// 예외 발생
throw new MyException("파일이 없습니다.", 404);
} catch (MyException e) {
System.out.println(e.getMessage()); // "파일이 없습니다."
System.out.println(e.getErrCode()); // 404
}
- 메시지와 에러코드를 나눠서 관리할 수 있기 때문에, 더 명확하고 풍부한 예외 처리가 가능해집니다.
기존에는 보통 Exception을 상속해서 checked 예외로 만들었는데,
요즘은 RuntimeException을 상속해서 unchecked 예외로 만드는 경우도 많아졌습니다. 이유는 다음과 같습니다:
Exception (checked) | RuntimeException (unchecked) |
예외 처리를 강제함 | 예외 처리를 선택할 수 있음 |
try-catch 또는 throws가 필수 | 예외 처리 생략 가능 |
복잡한 코드에서는 불편 | 간단한 예외 처리에 적합 |
그래서 예외 발생이 매우 드문 경우나 복잡한 상황에서 예외 처리를 강제하지 않으려는 경우에는
RuntimeException을 상속해서 unchecked 예외로 만드는 것이 유리할 수도 있습니다.
요약
- Exception을 상속하면 checked 예외, RuntimeException은 unchecked 예외
- 생성자에서 메시지와 함께 필요한 데이터를 저장할 수 있음
- 예외 클래스에 메서드 (getErrCode()) 추가 가능
- 상황에 따라 checked와 unchecked 중 선택하여 설계
'Java' 카테고리의 다른 글
연결된 예외 (0) | 2025.06.21 |
---|---|
예외 되던지기 (0) | 2025.06.21 |
Checked예외, Unchecked예외 (0) | 2025.06.21 |
try-catch가 동작하는 내부 구조 (0) | 2025.06.21 |
예외 클래스 계층구조 (0) | 2025.06.21 |