✅ Throwable
자바에서 Throwable
은 모든 예외와 오류의 최상위 클래스입니다. Throwable
은 예외와 오류 모두를 포함하며, 이를 통해 예외 처리 및 오류 처리를 일관되게 다룰 수 있습니다. Throwable
은 다음과 같은 주요 특징을 갖습니다.
- 계층 구조
`Throwable`은 예외와 오류를 처리하기 위한 계층 구조를 형성합니다. 이 계층 구조는 `Throwable` 클래스를 상속하는 `Exception`과 `Error` 클래스로 구성됩니다.
- 예외 처리
`Throwable`과 그 하위 클래스인 `Exception`은 예외 처리를 위해 사용됩니다. 예외는 프로그램의 정상적인 실행 흐름을 방해하는 상황을 나타내며, 개발자는 예외를 적절하게 처리하여 예외 상황에 대응할 수 있습니다.
- 오류 처리
`Throwable`의 하위 클래스인 `Error`는 프로그램에서 복구할 수 없는 치명적인 오류를 나타냅니다. `Error`는 주로 시스템 수준의 문제를 나타내며, 개발자는 이러한 오류에 대해서는 대응하기보다는 종료하거나 로깅하는 등의 작업을 수행해야 합니다.
- 예외 처리 메커니즘
`Throwable` 클래스 계층 구조는 예외 처리 메커니즘을 구현하는 데 사용됩니다. 예외는 `try-catch` 블록을 사용하여 처리하거나, `throws` 절을 통해 상위 호출자로 전파할 수 있습니다.
- 필수 메서드
`Throwable` 클래스는 예외 및 오류 처리에 필요한 다양한 메서드를 제공합니다. 예를 들어, `getMessage()`는 예외에 대한 상세한 메시지를 반환하고, `printStackTrace()`는 예외의 호출 스택 추적을 출력하는 등의 기능을 제공합니다.
- 사용자 정의 예외
개발자는 `Throwable`의 하위 클래스인 `Exception`을 확장하여 사용자 정의 예외 클래스를 만들 수 있습니다. 이를 통해 특정 예외 상황에 대한 처리 로직을 구현할 수 있습니다.
- Throwable
public class Throwable implements Serializable { //직열화 private static final long serialVersionUID = -3042686055658047285L; private transient Object backtrace; private String detailMessage; public Throwable() { fillInStackTrace(); } public Throwable(String message) { fillInStackTrace(); detailMessage = message; } public String getMessage() { return detailMessage; } public String toString() { String className = getClass().getName(); String message = getMessage(); return (message != null) ? (className + ": " + message) : className; } //오버로딩된 메소드를 호출함 //자기 자신은 아니고 밑의 PrintStrame을 매개변수로 받는 메소드 호출 public void printStackTrace() { printStackTrace(System.err); } //PrintWriter을 매개변수로 받는 메소드 호출 public void printStackTrace(PrintStream stream) { printStackTrace(new PrintWriter(stream)); } public void printStackTrace(PrintWriter writer) { writer.println(this); //throwable 자기 자신을 매개변수로 함. if (backtrace != null) { // 스택 트레이스 정보 출력 } else { // 예외 발생 지점부터의 스택 트레이스 출력 } } public Throwable fillInStackTrace() { // 스택 트레이스 정보 채우기 return this; } // 기타 메서드 및 멤버 변수 생략... }
- Throwable 클래스는 Serializable 인터페이스를 구현하고 있습니다. 예외 객체가 직렬화되어 전송되거나 저장될 수 있도록 해줍니다.
- Throwable 클래스에는 예외 메시지를 저장하기 위한 detailMessage 필드와, 스택 트레이스 정보를 저장하기 위한 backtrace 필드가 있습니다. backtrace 필드는 transient로 선언되어 직렬화에서 제외됩니다.
✅ Unchecked -Error, RunTimeException
"Unchecked"라는 용어는 자바에서 "Unchecked Exception" 및 "Unchecked Error"를 지칭하는 데 사용됩니다. 여기서 "Unchecked"는 예외 또는 오류의 발생 여부를 컴파일러가 확인하지 않는다는 의미입니다.
- Unchecked Exception
"Unchecked Exception"은 컴파일러가 예외 처리를 강제화하지 않는(확인하지 않는) 예외를 의미합니다. 이러한 예외는 `RuntimeException` 클래스 및 그 하위 클래스들을 포함하며, 개발자가 명시적인 예외 처리를 강제받지 않습니다. 따라서 예외를 처리하거나 전파하는 것은 개발자의 선택입니다. 대표적인 예시로는 `NullPointerException`, `ArrayIndexOutOfBoundsException`, `ArithmeticException` 등이 있습니다.
- Unchecked Error
"Unchecked Error"는 실행 중 발생하는 심각한 오류를 의미합니다. 이러한 오류는 컴파일러가 확인하지 않으며, 프로그램의 실행 도중 예상치 못한 상황이 발생할 수 있습니다. "Unchecked Error"는 `Error` 클래스 및 그 하위 클래스들을 포함하며, 개발자가 직접적으로 이러한 오류를 처리할 필요는 없습니다. 예시로는 `OutOfMemoryError`, `StackOverflowError` 등이 있습니다.
🔹Error Class
일반적으로 시스템 레벨의 심각한 예외 상황을 나타내며, 개발자가 직접 처리할 수 없는 예외입니다. Error
클래스는 시스템 레벨의 문제를 나타내며, 예를 들어 OutOfMemoryError
나 StackOverflowError
와 같은 예외가 있습니다. 이러한 예외는 주로 시스템의 복구 불가능한 상태를 나타내며, 프로그램이 종료되어야 할 수도 있습니다.
public class Error extends Throwable {
private static final long serialVersionUID = 4980196508277280342L;
public Error() {
super();
}
public Error(String message) {
super(message);
}
public Error(String message, Throwable cause) {
super(message, cause);
}
public Error(Throwable cause) {
super(cause);
}
// 기타 메서드 및 멤버 변수 생략...
}
자바에서는 Throwable 클래스 계층 구조의 하위 클래스인 Error를 사용하여 프로그램에서 복구할 수 없는 치명적인 오류를 나타냅니다.
주의할 점은 일반적인 상황에서 개발자가 Error 클래스를 사용할 필요는 없으며, 대부분의 경우 이러한 오류는 시스템 수준에서 처리되어야 합니다. Error 클래스는 일반적인 예외 처리 흐름과는 다른 동작을 수행하므로, 프로그램에 직접 사용하는 것은 권장되지 않습니다.
➡️주요한 치명적인 오류들은 다음과 같습니다:
- OutOfMemoryError
JVM의 힙 메모리 공간이 부족한 경우 발생하는 오류입니다. 프로그램이 필요한 메모리를 할당할 수 없을 때 발생하며, 주로 대용량 데이터 처리나 무한 재귀 호출 등으로 인해 발생할 수 있습니다.
- StackOverflowError
호출 스택(Stack)이 너무 깊게 쌓여 스택 메모리 공간을 초과한 경우 발생하는 오류입니다. 주로 무한 재귀 호출이나 스택 메모리 부족으로 인해 발생할 수 있습니다.
- NoClassDefFoundError
클래스를 찾을 수 없는 경우에 발생하는 오류입니다. 클래스 파일이 존재하지 않거나, 클래스 파일이 잘못되었거나, 클래스 패스에 문제가 있는 경우에 발생할 수 있습니다. SpringFramework에서 서로 다른 라이브러리를 사용할 때 라이브러리의 버전에 따라 해당 클래스가 없는 경우가 있습니다. 이때 주로 발생하는 오류입니다.
- UnsupportedClassVersionError
클래스 파일의 버전이 현재 JVM에서 지원되지 않는 경우 발생하는 오류입니다. 클래스 파일이 더 높은 버전의 JVM에서 컴파일되었을 때, 현재 사용 중인 낮은 버전의 JVM에서 이 오류가 발생할 수 있습니다.
- InternalError
JVM 내부에서 발생하는 치명적인 오류를 나타내는 오류입니다. JVM 자체의 구현 버그나 서브시스템에서 발생하는 오류로, 일반적으로 프로그램 코드로 복구할 수 없는 문제를 나타냅니다.
🔹RunTimeException
RuntimeException
클래스는 자바에서 Unchecked Exception을 나타내는 클래스입니다. 아래는 RuntimeException
클래스의 예시 소스 코드입니다.
public class RuntimeException extends Exception {
private static final long serialVersionUID = -7034897190745766939L;
public RuntimeException() {
super();
}
public RuntimeException(String message) {
super(message);
}
public RuntimeException(String message, Throwable cause) {
super(message, cause);
}
public RuntimeException(Throwable cause) {
super(cause);
}
// 기타 메서드 및 멤버 변수
/**
* Returns the detail message string of this throwable.
*
* @return the detail message string of this {@code Throwable} instance
* (which may be {@code null}).
*/
public String getMessage() {
// 예외의 상세 메시지 반환
return super.getMessage();
}
/**
* Returns a short description of this throwable.
*
* @return a string representation of this throwable.
*/
public String toString() {
// 예외의 간단한 설명 반환
return super.toString();
}
/**
* Prints this throwable and its backtrace to the standard error stream.
*/
public void printStackTrace() {
printStackTrace(System.err);
}
/**
* Prints this throwable and its backtrace to the specified print stream.
*
* @param stream {@link PrintStream} to use for output
*/
public void printStackTrace(PrintStream stream) {
// 스택 트레이스 정보를 지정된 출력 스트림에 출력
super.printStackTrace(stream);
}
/**
* Prints this throwable and its backtrace to the specified print writer.
*
* @param writer {@link PrintWriter} to use for output
*/
public void printStackTrace(PrintWriter writer) {
// 스택 트레이스 정보를 지정된 출력 writer에 출력
super.printStackTrace(writer);
}
// ...
// 기타 멤버 변수, 상수 등...
}
RuntimeException
클래스는 Exception
클래스를 상속하고 있으며, 예외 처리에 필요한 생성자와 메서드를 상속받아 사용합니다. 위의 예시에서는 RuntimeException
클래스의 생성자들이 정의되어 있습니다.
RuntimeException
클래스는 주로 프로그래밍 오류와 관련된 예외를 나타내는 데 사용됩니다. 이러한 예외는 개발자의 실수에 의해 발생하는 경우가 많으며, 예측하기 어렵고 컴파일 단계에서 확인하기 어렵습니다.
주의할 점은 RuntimeException
과 그 하위 클래스들은 예외 처리를 강제화하지 않습니다. 개발자가 예외를 처리하거나 예외를 전파하는 것은 선택 사항입니다. 따라서 이러한 예외를 사용할 때는 예외 상황에 대한 적절한 처리를 고려하여 프로그램의 안정성을 유지해야 합니다.
✅ Checked -Other Exception
"Checked Exception"은 컴파일러가 예외 처리를 강제화하는 예외를 말합니다. Checked Exception은 개발자가 예외 처리를 명시적으로 해야 하며, 컴파일러는 해당 예외를 처리하지 않은 경우 컴파일 에러를 발생시킵니다. 이는 예외 처리를 강제화하여 예외 상황에 대한 명확한 대응을 유도하는 것입니다.
주로 외부 리소스와의 상호 작용이 필요한 I/O 작업, 네트워크 통신, 데이터베이스 액세스 등에서 발생하는 예외들이 Checked Exception의 대표적인 예입니다. 몇 가지 예시로는 IOException
, SQLException
, FileNotFoundException
등이 있습니다.
Checked Exception을 처리하기 위해서는 try-catch
블록을 사용하여 예외를 직접 처리하거나, 해당 예외를 호출자에게 전파하기 위해 throws
선언을 사용하여 예외를 위임할 수 있습니다. 이를 통해 예외 상황에 대한 적절한 처리를 할 수 있습니다.
Other Exception은 RuntimeException
을 상속받지 않는 예외 클래스들을 포함하는 범주입니다. Checked Exception은 컴파일러가 예외 처리를 강제화하며, 개발자는 해당 예외를 명시적으로 처리하거나 예외를 전파해야 합니다. Other Exception은 아래와 같은 특징을 지닙니다.
- 예외 처리 강제화
Checked Exception은 컴파일러가 예외 처리를 강제화합니다. 개발자는 예외를 처리하는 코드를 작성하거나, 해당 예외를 throws 선언을 통해 호출자에게 전파해야 합니다. 이는 예외에 대한 명시적인 처리를 유도하여 안정성을 높이는 데 도움을 줍니다.
- 컴파일 에러 발생
Checked Exception을 처리하지 않거나 전파하지 않으면 컴파일 에러가 발생합니다. 이는 예외를 무시하거나 처리하지 않고 코드를 실행할 수 없게 만들어 프로그래머가 예외 처리에 대한 책임을 인식하도록 합니다.
- 외부 리소스와의 상호 작용
Checked Exception은 주로 외부 리소스와의 상호 작용에서 발생하는 예외로 사용됩니다. 파일 I/O, 네트워크 통신, 데이터베이스 액세스 등에서 예외가 발생할 수 있으며, 이러한 예외들은 개발자가 예측하고 대응할 수 있는 상황입니다.
🔹Exception Class
일반적인 예외 상황을 나타내며, 예외 상황에 대한 처리를 통해 프로그램의 정상적인 흐름을 제어할 수 있습니다. Exception
클래스는 다양한 하위 클래스를 가지고 있으며, 프로그래머가 직접 예외 클래스를 작성하여 사용할 수도 있습니다.
public class Exception extends Throwable {
private static final long serialVersionUID = -3387516993124229948L;
public Exception() {
super();
}
public Exception(String message) {
super(message);
}
public Exception(String message, Throwable cause) {
super(message, cause);
}
public Exception(Throwable cause) {
super(cause);
}
// 기타 메서드 및 멤버 변수 생략...
}
Exception
클래스는 일반적인 예외 상황을 나타내는 데 사용됩니다. 개발자가 직접 예외를 발생시키기 위해 사용할 수도 있습니다. `IOException`, `ClassNotFoundException`, `NullPointerException` 등이 Exception
클래스를 상속받아 구현된 예외들입니다.
주의할 점은 예외 처리를 할 때는 구체적인 예외 클래스를 사용하는 것이 좋습니다. Exception
클래스를 직접 사용하기보다는 예외 상황에 맞는 하위 클래스를 활용하여 예외 처리를 하는 것이 더 명확하고 유연한 코드 작성을 도와줍니다.
🏷️이미지 출처와 참고한 사이트
Uploaded by N2T