- 사전지식을 조금 알아야한다.
1️⃣ Java 예외 및 오류 개요
1. Exception (예외)
- 예측 가능한 상황에서 발생하는 오류로,
try-catch
또는throws
키워드로 처리 가능하다.
✅ Checked Exception (검사 예외)
- 반드시
try-catch
로 처리하거나throws
로 선언해야 한다. - 대표적인 예시:
IOException
SQLException
✅ Unchecked Exception (비검사 예외)
RuntimeException
을 상속받으며, 예외 처리가 강제되지 않는다.- 대표적인 예시:
NullPointerException
IndexOutOfBoundsException
2. Error (에러)
- 프로그램이 복구할 수 없는 심각한 문제로, 일반적으로 예외 처리를 하지 않는다.
- 대표적인 예시
OutOfMemoryError
: 메모리가 부족할 때 발생.StackOverflowError
: 재귀 호출이 너무 깊어졌을 때 발생.NoClassDefFoundError
: 클래스 파일을 찾을 수 없을 때 발생.
3. RuntimeException (런타임 예외)
- 실행 중에 발생하는 예외로, 컴파일러가 체크하지 않는다.
- 대표적인 예시
NullPointerException
:null
객체를 참조할 때 발생.ArrayIndexOutOfBoundsException
: 배열 인덱스를 초과할 때 발생.ArithmeticException
: 숫자 연산 오류 (1 / 0
같은 경우).ClassCastException
: 잘못된 타입 변환 시 발생.
4. IOException (입출력 예외)
- 파일, 네트워크, 스트림 등의 입출력 작업 중 발생하는 예외.
- 대표적인 예시
FileNotFoundException
: 파일을 찾을 수 없을 때.EOFException
: 스트림의 끝에 도달했을 때.SocketException
: 네트워크 소켓 관련 오류.
5. SQLException (SQL 관련 예외)
- 데이터베이스 연동 중 발생하는 예외.
6. LinkageError (링크 오류)
- 클래스 로딩 시 발생하는 오류.
2️⃣ 예외(Exception)
- 예외는 프로그램 실행 중 예상하지 못한 상황이 발생하는 것을 의미합니다.
→ 대표적인 산술 예외:10 / 0
(0 으로 나누기) - 의도적으로 예외를 발생시킬 때는
throw
키워드를 통해 발생시킵니다. - 예외를 처리하지 않으면 프로그램이 중단될 수 있습니다.
- 그래서
예외처리(try-catch)
를 통해 프로그램이 안정적으로 실행되게 할 수 있습니다.
3️⃣ 예외발생 종류
1. 의도하지 않은 예외
- 아래 코드에서
10 / 0
연산을 수행하면서ArithmeticException
(산술예외)가 발생합니다. - 0 으로 나누는 연산은 허용되지 않음으로 프로그램이 비정상적으로 종료됩니다.
- 예외를 처리하지 않으면 이후 코드는 실행되지 않습니다.
public class Main {
public static void main(String[] args) {
System.out.println("프로그램 시작");
int result = 10 / 0; // ❌ 예외 발생 (ArithmeticException)
System.out.println("이 문장은 실행되지 않음");
}
}
OUTPUT
Exception in thread "main" java.lang.ArithmeticException: / by zero at chapter3.exception.Main.main(Main.java:8)
Process finished with exit code 1
2. 의도적인 예외 - throw
- 특정 조건에서 의도적으로 예외를 발생시킬 수도 있습니다.
- 예) 비즈니스 규칙을 위반한 경우(미성년자접근)
- 아래 코드에서
age < 18
조건을 만족하면IllegalArgumentException
을 발생시킵니다. throw
를 활용하면 특정 상황에서 예외를 명확하게 정의하고 제어할 수 있습니다.
public class Main {
public static void main(String[] args) {
int age = 10;
if (age < 18) {
// ✅ 의도적으로 예외를 발생시키는 부분
throw new IllegalArgumentException("미성년자는 접근할 수 없습니다!");
}
System.out.println("....");
}
}
4️⃣ 예외 구조와 종류
1.RuntimeException - UncheckedException
- RuntimeException
을 상속받는 모든 예외를 UncheckedException
이라고 합니다.
- 예외처리를 컴파일러가 확인하지 않습니다.
2. Exception - CheckedException
- Exception
클래스를 직접 상속받는 모든 예외를 CheckedException
이라고합니다. RuntimeException
과 RuntimeException
을 상속받은 예외는 제외합니다.
- 예외처리를 컴파일러가 확인해 줍니다.
4️⃣ 예외 전파
- 예외 전파는 메서드에서 발생한 예외가 해당 메서드 내에서 처리되지 않았을 때 메서드를 호출한 상위 메서드로 전달되는 과정을 말합니다.
- 예외가 프로그램 시작 지점(
main()
) 까지 전파되고 끝내 처리되지 않으면 프로그램이 비정상 종료 됩니다. - 예외 전파를
RuntimeException
그리고Exception
예시를 통해 알아봅시다.
5️⃣ RuntimeException
- UncheckedException
- 컴파일러가 예외 처리를 강제하지 않는 예외입니다.
- 예외 처리를 하지 않아도 컴파일 오류(빨간 줄) 가 발생하지 않습니다.
- 처리되지 않은 예외는 계속 프로그램 시작 지점까지 전파됩니다.
- 끝내 예외가 처리되지 않으면 프로그램이 비정상적으로 종료됩니다.
RuntimeException
을 상속받는 모든 예외를UncheckedException
이라고 합니다.
✅ try-catch
활용
throw new RuntimeException()
을 통해서RuntimeException
예외를 발생 시킬 수 있음.
public class ExceptionPractice {
public void callUncheckedException() {
if (true) {
System.out.println("언체크 예외 발생");
throw new RuntimeException(); // ✅ 예외발생
}
}
}
public class Main {
public static void main(String[] args) {
// 예외 실습 객체 인스턴스화
ExceptionPractice exceptionPractice = new ExceptionPractice();
// ✅ 언체크 예외 호출
exceptionPractice.callUncheckedException();
// ❌ 예외처리를 해주지 않았기 때문에 프로그램이 종료됩니다.
System.out.println("이 줄은 실행되지 않습니다.");
}
}
public class Main {
public static void main(String[] args) {
ExceptionPractice exceptionPractice = new ExceptionPractice();
// ✅ 상위로 전파된 예외처리
try {
exceptionPractice.callUncheckedException();
} catch (RuntimeException e) { // ✅ 예외처리
System.out.println("언체크 예외 처리");
} catch (Exception e) {
System.out.println("체크 예외 처리");
}
System.out.println("프로그램 종료");
}
}
6️⃣ Exception
- CheckedException
Exception
클래스를 직접 상속받는 모든 예외를CheckedException
이라고 합니다.RuntimeException
을 상속받는 예외는 제외.
- 컴파일러가 예외 처리를 강제하는 예외입니다.
- 예외 처리를 하지 않으면 “컴파일 오류가 발생한다(코드에 빨간줄)” 라고 이해하시면 쉽습니다.
- 반드시
try-catch
로 예외를 처리하거나throws
키워드를 사용해야 합니다.throws
로 예외 처리의 책임을 호출자에게 전가할 수 있습니다.
✅ try-catch 활용
CheckedException
을try-catch
를 사용하여 직접 처리하는 방식입니다.
public class ExceptionPractice {
public void callCheckedException() {
// ✅ try-catch 로 예외 처리
try {
if (true) {
System.out.println("체크예외 발생");
throw new Exception();
}
} catch (Exception e) {
System.out.println("예외 처리");
}
}
}
public class Main {
public static void main(String[] args) {
// 예외 실습 객체 인스턴스화
ExceptionPractice exceptionPractice = new ExceptionPractice();
// ✅ 체크예외 호출
exceptionPractice.callCheckedException();
}
}
✅ throws 활용
throws
키워드를 사용하여 예외를 호출한 곳에서 처리하도록 강제하는 방식입니다.
→ (책임 전가)public class ExceptionPractice { public void callCheckedException() throws Exception { // ✅ throws 예외를 상위로 전파 if (true) { System.out.println("체크예외 발생"); throw new Exception(); } } }
package chapter3.exception;
public class Main {
public static void main(String[] args) {
// 예외 실습 객체 인스턴스화
ExceptionPractice exceptionPractice = new ExceptionPractice();
// 체크 예외 사용
// ✅ 반드시 상위 메서드에서 try-catch 를 활용해 주어야합니다.
try {
exceptionPractice.callCheckedException();
} catch (Exception e) {
System.out.println("예외처리");
}
}
}
7️⃣ 정리
- 예외가 발생하고 처리되지 않으면 프로그램이 비정상적으로 종료될 수 있기 때문에 꼭 예외 처리는 필수입니다.
CheckedException
은 컴파일러를 통해 개발자에게 반드시 처리해야 하는 예외를 알려줄 수 있습니다.UncheckedException
은 개발자가 충분히 예측하고 방지할 수 있는 경우 사용합니다.
→ 숫자를 0으로 나누는 오류 등은 코드 검토로 충분히 예방 가능합니다.
→ 이런 예외 처리까지CheckedException
으로 처리하도록 강제한다면 모든 예외 상황을 처리해야 하는 답답한 상황이 벌어져 개발 생산성이 저하되고 불필요한 코드가 많아질 수 있습니다.
'코딩 공부 > Java' 카테고리의 다른 글
[Java] Chpater 3 - 03) 컬렉션(Collection) (0) | 2025.02.26 |
---|---|
[Java] Chpater 3 - 02) Optional - null 을 다루는 법 (0) | 2025.02.26 |
[Java] Chpater 2- 10) 객체지향 - 다형성 (0) | 2025.02.25 |
[Java] Chpater 2- 09) 객체지향 - 추상화 (0) | 2025.02.25 |
[Java] Chpater 2- 08) 객체지향 - 상속 (0) | 2025.02.25 |