λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

빈 ꡬ멍 μ±„μš°κΈ°

[Java] μ˜ˆμ™Έ, μ—λŸ¬

좜처

ChatGPT


μžλ°”(Java)μ—μ„œλŠ” ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 쀑 λ°œμƒν•˜λŠ” 비정상적인 상황을 μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ μ˜ˆμ™Έ(Exception)와 μ—λŸ¬(Error)λ₯Ό μ‚¬μš©ν•œλ‹€. 이 λ‘˜μ€ λͺ¨λ‘ `Throwable` 클래슀λ₯Ό 상속받은 μžμ‹ ν΄λž˜μŠ€μ΄μ§€λ§Œ, κ·Έ λͺ©μ κ³Ό μ‚¬μš© λ°©μ‹μ—μ„œ μ€‘μš”ν•œ 차이점이 μžˆλ‹€. 

1. μ˜ˆμ™Έ(Exception)와 μ—λŸ¬(Error)의 κΈ°λ³Έ κ°œλ…

μ˜ˆμ™Έ Exception

ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 쀑에 λ°œμƒν•  수 μžˆλŠ” 예기치 μ•Šμ€ 상황을 μ˜λ―Έν•œλ‹€. μ΄λŸ¬ν•œ 상황은 주둜 ν”„λ‘œκ·Έλž¨μ˜ 논리적인 였λ₯˜λ‚˜ 잘λͺ»λœ μ‚¬μš©μž μž…λ ₯, λ„€νŠΈμ›Œν¬ 문제 λ“± 비ꡐ적 예츑 κ°€λŠ₯ν•œ λ¬Έμ œλ“€μ΄λ‹€. μ˜ˆμ™ΈλŠ” κ°œλ°œμžκ°€ ν”„λ‘œκ·Έλž¨ λ‚΄μ—μ„œ μ μ ˆν•˜κ²Œ μ²˜λ¦¬ν•  수 있으며, `Exception` 클래슀의 μΈμŠ€ν„΄μŠ€λ‘œ ν‘œν˜„λ©λ‹ˆλ‹€.

μ—λŸ¬ Error

μžλ°” ν”„λ‘œκ·Έλž¨μ΄ μ •μƒμ μœΌλ‘œ 싀행될 수 μ—†λŠ” μ‹¬κ°ν•œ 문제λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. μ΄λŸ¬ν•œ λ¬Έμ œλŠ” 주둜 JVM의 μžμ› λΆ€μ‘±, λ©”λͺ¨λ¦¬ λΆ€μ‘±(OutOfMemoryError), μŠ€νƒ μ˜€λ²„ν”Œλ‘œ(StackOverflowError) λ“± μ‹œμŠ€ν…œ λ ˆλ²¨μ—μ„œ λ°œμƒν•˜λŠ” λ¬Έμ œλ“€μ΄λ‹€. μ—λŸ¬λŠ” 일반적으둜 ν”„λ‘œκ·Έλž¨μ—μ„œ 볡ꡬ할 수 μ—†λŠ” 상황을 μ˜λ―Έν•˜λ©°, `Error` 클래슀의 μΈμŠ€ν„΄μŠ€λ‘œ ν‘œν˜„λœλ‹€.

2. μ˜ˆμ™Έ(Exception)와 μ—λŸ¬(Error)의 차이점

νŠΉμ„± μ˜ˆμ™Έ Exception μ—λŸ¬ Error
κΈ°λ³Έ κ°œλ… ν”„λ‘œκ·Έλž¨ λ‚΄μ—μ„œ μ˜ˆμΈ‘ κ°€λŠ₯ν•œ λ¬Έμ œ μƒν™©  JVMμ—μ„œ λ°œμƒν•˜λŠ” μ‹¬κ°ν•œ μ‹œμŠ€ν…œ λ ˆλ²¨ λ¬Έμ œ 
상속 계측 java.lang.Exception java.lang.Error
볡ꡬ κ°€λŠ₯μ„± λŒ€λΆ€λΆ„μ˜ κ²½μš° ν”„λ‘œκ·Έλž¨ μ½”λ“œμ—μ„œ λ³΅κ΅¬ κ°€λŠ₯ 볡ꡬ λΆˆκ°€λŠ₯, ν”„λ‘œκ·Έλž¨ μ’…λ£Œκ°€ μΌλ°˜μ 
μ˜ˆμ‹œ `IOException`, `SQLException`, `NullPointerException` `OutOfMemoryError`, `StackOverflowError`, `VirtualMachineError`
μš©λ„ κ°œλ°œμžκ°€ μ²˜λ¦¬ν•˜κ³  볡ꡬ할 수 μžˆλŠ” 였λ₯˜ 처리 μ‹œμŠ€ν…œ λ ˆλ²¨μ˜ μ˜€λ₯˜λ‘œ, λ³΅κ΅¬λ₯Ό μ‹œλ„ν•˜μ§€ μ•ŠμŒ
처리 방법 `try-catch` λΈ”λ‘μœΌλ‘œ μ˜ˆμ™Έλ₯Ό μž‘κ³  μ²˜λ¦¬ 일반적으둜 μ²˜λ¦¬ν•˜μ§€ μ•ŠμŒ; μ—λŸ¬ λ°œμƒ μ‹œ ν”„λ‘œκ·Έλž¨ μ’…λ£Œκ°€ λ°œμƒν•  μˆ˜ μžˆμŒ

 

3. μ˜ˆμ™Έμ˜ μ’…λ₯˜

μžλ°”μ—μ„œ μ˜ˆμ™ΈλŠ” 크게 두 κ°€μ§€λ‘œ λ‚˜λ‰œλ‹€.

1) κ²€μ‚¬λœ μ˜ˆμ™Έ Checked Exception 

컴파일 μ‹œμ μ— μ»΄νŒŒμΌλŸ¬κ°€ λ°˜λ“œμ‹œ μ²˜λ¦¬ν•΄μ•Ό ν•œλ‹€κ³  μš”κ΅¬ν•˜λŠ” μ˜ˆμ™Έμ΄λ‹€. μ΄λŸ¬ν•œ μ˜ˆμ™ΈλŠ” κ°œλ°œμžκ°€ 예츑 κ°€λŠ₯ν•˜λ©°, μ μ ˆν•˜κ²Œ μ²˜λ¦¬ν•˜μ—¬ ν”„λ‘œκ·Έλž¨μ˜ μ•ˆμ •μ„±μ„ 높일 수 μžˆλ‹€. 일반적으둜 μ™ΈλΆ€ ν™˜κ²½κ³Ό μƒν˜Έμž‘μš©ν•  λ•Œ λ°œμƒν•œλ‹€.

μ˜ˆμ‹œ

  • `IOException`: 파일 μž…μΆœλ ₯ μž‘μ—… 쀑 λ°œμƒν•  수 μžˆλŠ” μ˜ˆμ™Έ 
  • `SQLException`: λ°μ΄ν„°λ² μ΄μŠ€ μž‘μ—… 쀑 λ°œμƒν•  수 μžˆλŠ” μ˜ˆμ™Έ

νŠΉμ§•

  • `try-catch` λΈ”λ‘μ΄λ‚˜ `throws` ν‚€μ›Œλ“œλ₯Ό 톡해 μ˜ˆμ™Έλ₯Ό λͺ…μ‹œμ μœΌλ‘œ μ²˜λ¦¬ν•΄μ•Ό ν•œλ‹€. 
  • μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜μ§€ μ•ŠμœΌλ©΄ 컴파일 였λ₯˜κ°€ λ°œμƒν•œλ‹€.

import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class CheckedExceptionExample {
    public static void main(String[] args) {
        try {
            File file = new File("nonexistentfile.txt");
            FileReader fr = new FileReader(file);  // FileNotFoundException λ°œμƒ κ°€λŠ₯
        } catch (IOException e) {
            System.out.println("νŒŒμΌμ„ μ½λŠ” 도쀑 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€: " + e.getMessage());
        }
    }
}


2) κ²€μ‚¬λ˜μ§€ μ•Šμ€ μ˜ˆμ™Έ Unchecked Exception 

λŸ°νƒ€μž„ μ‹œμ μ— λ°œμƒν•˜λŠ” μ˜ˆμ™Έλ‘œ, μ»΄νŒŒμΌλŸ¬κ°€ κ²€μ‚¬ν•˜μ§€ μ•ŠλŠ”λ‹€. 주둜 ν”„λ‘œκ·Έλž˜λ° 였λ₯˜(예: 잘λͺ»λœ 둜직, 잘λͺ»λœ API μ‚¬μš©)둜 인해 λ°œμƒν•˜λ©°, κ°œλ°œμžκ°€ 사전에 λ°©μ§€ν•˜λŠ” 것이 λ°”λžŒμ§ν•˜λ‹€.

μ˜ˆμ‹œ

  • `NullPointerException`: κ°μ²΄κ°€ null인 μƒνƒœμ—μ„œ λ©”μ„œλ“œλ‚˜ ν•„λ“œλ₯Ό μ ‘κ·Όν•˜λ €κ³  ν•  λ•Œ λ°œμƒ
  • `ArrayIndexOutOfBoundsException`: λ°°μ—΄μ˜ μœ νš¨ν•˜μ§€ μ•Šμ€ μΈλ±μŠ€μ— μ ‘κ·Όν•˜λ €κ³  ν•  λ•Œ λ°œμƒ
  • `ArithmeticException`: 0으둜 λ‚˜λˆ„κΈ°λ₯Ό μ‹œλ„ν•  λ•Œ λ°œμƒ

νŠΉμ§•

  • μ»΄νŒŒμΌλŸ¬κ°€ μ˜ˆμ™Έ 처리λ₯Ό κ°•μ œν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ—, `try-catch` 블둝 없이도 컴파일이 κ°€λŠ₯ν•˜λ‹€.
  • μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜μ§€ μ•ŠμœΌλ©΄ ν”„λ‘œκ·Έλž¨μ΄ 비정상 μ’…λ£Œλ  수 μžˆλ‹€.
public class UncheckedExceptionExample {
    public static void main(String[] args) {
        int[] numbers = {1, 2, 3};
        System.out.println(numbers[3]);  // ArrayIndexOutOfBoundsException λ°œμƒ
    }
}


4. μ—λŸ¬(Error)의 μ’…λ₯˜

μ—λŸ¬λŠ” ν”„λ‘œκ·Έλž¨ μ½”λ“œμ—μ„œ 직접 μ²˜λ¦¬ν•  ν•„μš”κ°€ μ—†λŠ”, λ˜λŠ” μ²˜λ¦¬ν•  수 μ—†λŠ” μ‹¬κ°ν•œ 문제λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. 주둜 JVM이 비정상적인 상황에 μ§λ©΄ν–ˆμ„ λ•Œ λ°œμƒν•œλ‹€.

μ£Όμš” μ—λŸ¬ μ˜ˆμ‹œ

  • `OutOfMemoryError`: νž™ λ©”λͺ¨λ¦¬κ°€ λΆ€μ‘±ν•  λ•Œ λ°œμƒν•œλ‹€. 예λ₯Ό λ“€μ–΄, λŒ€λŸ‰μ˜ 객체λ₯Ό μƒμ„±ν•˜κ±°λ‚˜ λ©”λͺ¨λ¦¬ λˆ„μˆ˜κ°€ λ°œμƒν–ˆμ„ λ•Œ λ°œμƒν•  수 μžˆλ‹€.
  • `StackOverflowError`: μž¬κ·€ 호좜이 λ„ˆλ¬΄ κΉŠμ–΄μ Έμ„œ μŠ€νƒ λ©”λͺ¨λ¦¬κ°€ 초과될 λ•Œ λ°œμƒν•œλ‹€.
  • `VirtualMachineError`: JVM이 μ†μƒλ˜κ±°λ‚˜ 운영 체제 μžμ›μ„ μ‚¬μš©ν•  수 없을 λ•Œ λ°œμƒν•œλ‹€. 예λ₯Ό λ“€μ–΄, `InternalError`, `UnknownError` 등이 μžˆλ‹€.

 

μ—λŸ¬λŠ” 일반적으둜 ν”„λ‘œκ·Έλž¨ λ‚΄μ—μ„œ 볡ꡬ할 수 μ—†μœΌλ―€λ‘œ, λ°œμƒν•˜λ©΄ ν”„λ‘œκ·Έλž¨μ€ μ’…λ£Œλœλ‹€.

public class ErrorExample {
    public static void main(String[] args) {
        // λ¬΄ν•œ μž¬κ·€ 호좜둜 인해 StackOverflowError λ°œμƒ
        causeStackOverflow();
    }

    public static void causeStackOverflow() {
        causeStackOverflow();  // λ¬΄ν•œ μž¬κ·€ 호좜
    }
}

 

5. κ²°λ‘ 

  • μ˜ˆμ™Έ(Exception): ν”„λ‘œκ·Έλž¨μ—μ„œ 예츑 κ°€λŠ₯ν•œ 였λ₯˜ 상황을 λ‚˜νƒ€λ‚΄λ©°, 볡ꡬ할 수 μžˆλŠ” κ°€λŠ₯성이 μžˆλ‹€. `Checked Exception`κ³Ό `Unchecked Exception`으둜 λ‚˜λ‰˜λ©°, κ°œλ°œμžλŠ” 이λ₯Ό 적절히 μ²˜λ¦¬ν•΄μ•Ό ν•œλ‹€.
  • μ—λŸ¬(Error): JVM λ ˆλ²¨μ—μ„œ λ°œμƒν•˜λŠ” μ‹¬κ°ν•œ 문제둜, 일반적으둜 볡ꡬ할 수 μ—†λ‹€. ν”„λ‘œκ·Έλž¨ μ½”λ“œμ—μ„œ μ²˜λ¦¬ν•˜κΈ°λ³΄λ‹€λŠ” μ‹œμŠ€ν…œμ˜ μ•ˆμ •μ„±μ΄λ‚˜ μžμ› 문제둜 인해 λ°œμƒν•˜λ©°, ν”„λ‘œκ·Έλž¨ μ’…λ£Œλ₯Ό μ•ΌκΈ°ν•œλ‹€.

Javaμ—μ„œ μ˜ˆμ™Έμ™€ μ—λŸ¬μ˜ ꡬ뢄은 ν”„λ‘œκ·Έλž¨μ˜ μ•ˆμ •μ„±μ„ 높이고 μ˜ˆμ™Έ 상황을 효율적으둜 κ΄€λ¦¬ν•˜λŠ” 데 μ€‘μš”ν•˜λ‹€. 이λ₯Ό 톡해 κ°œλ°œμžλŠ” μ˜ˆμ™Έλ₯Ό 적절히 μ²˜λ¦¬ν•˜κ³ , μ˜ˆμƒμΉ˜ λͺ»ν•œ 였λ₯˜μ— λŒ€λΉ„ν•  수 μžˆλ‹€.