chapter14. μ˜ˆμ™Έ

κΉ€ν˜„μš°Β·2024λ…„ 6μ›” 3일
0

java

λͺ©λ‘ 보기
12/12
post-thumbnail

λ„€, κ·Έ ν‘œν˜„μ€ λ§žμŠ΅λ‹ˆλ‹€. 체크 μ˜ˆμ™Έμ™€ λŸ°νƒ€μž„ μ˜ˆμ™Έμ˜ 본질적인 차이λ₯Ό 잘 μ„€λͺ…ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό μ’€ 더 ꡬ체적이고 λͺ…ν™•ν•˜κ²Œ λ‹€λ“¬μ–΄μ„œ μž‘μ„±ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

πŸ’» μ˜ˆμ™Έ

ν”„λ‘œκ·Έλž¨μ„ κ°œλ°œν•˜λ‹€ 보면 λ‹€μ–‘ν•œ 였λ₯˜ 상황을 마주치게 λœλ‹€. 
μ΄λŠ” 논리적인 문제일 μˆ˜λ„ 있고, λ°°μ—΄μ˜ 인덱슀λ₯Ό 잘λͺ» μ°Έμ‘°ν•˜λŠ” 문제일 μˆ˜λ„ μžˆλ‹€.

κΈ°μ‘΄μ—λŠ” μ΄λŸ¬ν•œ 문제λ₯Ό if와 else 문을 톡해 μ²˜λ¦¬ν–ˆλ‹€. 
ν•˜μ§€λ§Œ μ΄λŸ¬ν•œ λ°©μ‹μ˜ 단점은 ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μ •ν™•ν•œ 문제λ₯Ό μΈμ§€ν•˜κ³  일일이 ν•΄κ²°ν•΄μ•Ό ν•œλ‹€λŠ” 점이닀.

μ΄λŸ¬ν•œ 단점을 λ³΄μ™„ν•˜κΈ° μœ„ν•΄ λ“±μž₯ν•œ 것이 λ°”λ‘œ μ˜ˆμ™Έ μ²˜λ¦¬λ‹€.

πŸ’» μ˜ˆμ™Έ 처리

μ˜ˆμ™Έ μ²˜λ¦¬λŠ” μ•žμ„œ 배운 μΆ”μƒν™”μ˜ μΌμ’…μœΌλ‘œ λ³Ό 수 μžˆλ‹€. 
ν”„λ‘œκ·Έλž˜λ¨Έκ°€ λͺ¨λ“  였λ₯˜ 상황을 μ„Έμ„Ένžˆ μ•Œ ν•„μš” 없이, 
νŠΉμ • λͺ…령어와 클래슀λ₯Ό 톡해 μ˜ˆμ™Έ 상황을 μ „λ°˜μ μœΌλ‘œ κ΄€λ¦¬ν•˜κ³  μ²˜λ¦¬ν•  수 있게 ν•œλ‹€.

이λ₯Ό 톡해 μ½”λ“œμ˜ 가독성과 μœ μ§€λ³΄μˆ˜μ„±μ΄ ν–₯μƒλ˜λ©°, 
ν”„λ‘œκ·Έλž¨μ΄ μ˜ˆμƒμΉ˜ λͺ»ν•œ 였λ₯˜λ‘œ 인해 λΉ„μ •μƒμ μœΌλ‘œ μ’…λ£Œλ˜λŠ” 것을 방지할 수 μžˆλ‹€.

μžλ°”μ—μ„œ μ˜ˆμ™Έ μ²˜λ¦¬λŠ” try, catch, finally 블둝과 throw, throws ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ κ΅¬ν˜„ν•œλ‹€. 
try λΈ”λ‘μ—λŠ” μ˜ˆμ™Έκ°€ λ°œμƒν•  수 μžˆλŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•˜κ³ , catch λΈ”λ‘μ—μ„œλŠ” ν•΄λ‹Ή μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•œλ‹€. 
finally 블둝은 μ˜ˆμ™Έ λ°œμƒ 여뢀와 관계없이 항상 μ‹€ν–‰λ˜λŠ” μ½”λ“œλ₯Ό ν¬ν•¨ν•œλ‹€. 
throw ν‚€μ›Œλ“œλŠ” λͺ…μ‹œμ μœΌλ‘œ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€λŠ” 데 μ‚¬μš©λ˜κ³ , 
throws ν‚€μ›Œλ“œλŠ” λ©”μ„œλ“œκ°€ νŠΉμ • μ˜ˆμ™Έλ₯Ό 던질 수 μžˆμŒμ„ μ„ μ–Έν•œλ‹€.

πŸ“– try-catch

μ˜ˆμ™Έ 처리λ₯Ό μœ„ν•΄ try-catch 문을 μ‚¬μš©ν•œλ‹€.

try λΈ”λ‘μ—μ„œλŠ” μ˜ˆμ™Έκ°€ λ°œμƒν•  λ§Œν•œ ꡬ간을 감싸고,
catch λΈ”λ‘μ—μ„œλŠ” μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ μ‹€ν–‰ν•  λ¬Έμž₯을 λ„£λŠ”λ‹€.

λ°°μ—΄μ˜ λ²”μœ„λ₯Ό 잘λͺ» μ‚¬μš©ν•  λ•Œλ₯Ό 예둜 λ“€μ–΄λ³΄μž:

public class ExceptionPrac {
    public static void main(String[] args) {
        int[] arr = new int[5];

        try {
            System.out.println(arr[5]);
        } catch (Exception e) {
            System.out.println("λ°°μ—΄μ˜ λ²”μœ„λ₯Ό λ²—μ–΄λ‚¬μŠ΅λ‹ˆλ‹€.");
        }
    }
}

λ‹€μŒκ³Ό 같이 λ°°μ—΄μ˜ λ²”μœ„λ₯Ό λ²—μ–΄λ‚˜κ²Œ μ‚¬μš©ν•˜λ©΄:

사진과 같은 κ²°κ³Όκ°€ λ‚˜μ˜€κ²Œ λœλ‹€.

λ³΄λ‹€μ‹œν”Ό, try λΈ”λ‘μ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•˜μ—¬ catch 블둝 λ‚΄λΆ€μ˜ λ¬Έμž₯이 μ‹€ν–‰λ˜μ—ˆλ‹€.

πŸ“– finally

finallyλŠ” 무슨 일이 μžˆμ–΄λ„ μ‹€ν–‰λ˜λŠ” 블둝이닀.

try-catchμ—μ„œ μ–΄λ–€ 것이 μ‹€ν–‰λ˜λ“  
finallyλŠ” 무쑰건 μ‹€ν–‰λœλ‹€.

public class ExceptionPrac {
    public static void main(String[] args) {
        int[] arr = new int[5];

        try {
            System.out.println(arr[5]);
        } catch (Exception e) {
            System.out.println("λ°°μ—΄μ˜ λ²”μœ„λ₯Ό λ²—μ–΄λ‚¬μŠ΅λ‹ˆλ‹€.");
        } finally {
            System.out.println("μ–˜λŠ” 무쑰건 μ‹€ν–‰ν•΄μ•Όν•΄");
        }
    }
}

πŸ“– catch 쀑첩

catch 블둝에 Exception e라고 적힌 것을 λ³Ό 수 μžˆλ‹€.

μ€‘κ΄„ν˜Έ λ‚΄λΆ€μ—λŠ” μ˜ˆμ™Έμ˜ μ’…λ₯˜λ₯Ό μ“°λ©°, Exception은 μ˜ˆμ™Έμ˜ μ’…λ₯˜λ₯Ό λ‚˜νƒ€λ‚΄λŠ” "클래슀"이닀.

Exception 클래슀의 κ³„μΈ΅λ„λŠ” λ‹€μŒκ³Ό κ°™λ‹€:

Throwable 객체가 μ—λŸ¬μ™€ μ˜ˆμ™Έ 처리λ₯Ό λ‹€λ£¨λŠ” μ΅œμƒμœ„ 클래슀이며,
Exception은 처리 κ°€λŠ₯ν•œ μ˜ˆμ™Έλ₯Ό,
ErrorλŠ” ν”„λ‘œκ·Έλž¨μ—μ„œ 볡ꡬ할 수 μ—†λŠ” 상황을 닀룬닀.

Exception 클래슀의 μžμ‹ ν΄λž˜μŠ€λ“€μ€ λ‹€μ–‘ν•œ 상황에 λŒ€μ‘λœλ‹€.

catch둜 λ‹€μ‹œ λ„˜μ–΄μ™€μ„œ tryλŠ” ν•œλ²ˆλ§Œ μ‚¬μš©ν•΄μ•Ό ν•˜μ§€λ§Œ catchλŠ” μ—¬λŸ¬ 번 μ‚¬μš©ν•  수 μžˆλ‹€.
이것은 λ‹€μ–‘ν•œ μ˜ˆμ™Έ ν΄λž˜μŠ€κ°€ μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

public class ExceptionPrac {
    public static void main(String[] args) {
        int[] arr = new int[5];

        try {
            System.out.println(arr[5]);
        } catch (Exception e) {
            System.out.println("λ°°μ—΄μ˜ λ²”μœ„λ₯Ό λ²—μ–΄λ‚¬μŠ΅λ‹ˆλ‹€.");
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("ArrayIndexOutOfBoundsException");
        } finally {
            System.out.println("μ–˜λŠ” 무쑰건 μ‹€ν–‰ν•΄μ•Όν•΄");
        }
    }
}

μœ„ μ½”λ“œμ—μ„œλŠ” catch 블둝을 μ€‘μ²©ν•΄μ„œ μ‚¬μš©ν•  수 μžˆμ„ 것 κ°™μ§€λ§Œ 였λ₯˜κ°€ λ°œμƒν•œλ‹€.

μ΄λŠ” 클래슀의 계측도와 관련이 μžˆλ‹€.

Exception ν΄λž˜μŠ€λŠ” λͺ¨λ“  μ˜ˆμ™Έμ˜ μ΅œμƒμœ„ 계측이닀.
λ”°λΌμ„œ Exception은 μ˜ˆμ™Έμ— λŒ€ν•œ λͺ¨λ“  상황을 닀룬닀.
κ·ΈλŸ¬λ―€λ‘œ Exception으둜 이미 ν•΄κ²° κ°€λŠ₯ν•œλ° 뒀에 λ‹€λ₯Έ μ˜ˆμ™Έλ₯Ό 덧뢙일 ν•„μš”κ°€ μ—†λ‹€.
public class ExceptionPrac {
    public static void main(String[] args) {
        int[] arr = new int[5];

        try {
            System.out.println(arr[5]);
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("ArrayIndexOutOfBoundsException");
        } catch (Exception e) {
            System.out.println("λ°°μ—΄μ˜ λ²”μœ„λ₯Ό λ²—μ–΄λ‚¬μŠ΅λ‹ˆλ‹€.");
        } finally {
            System.out.println("μ–˜λŠ” 무쑰건 μ‹€ν–‰ν•΄μ•Όν•΄");
        }
    }
}

μˆœμ„œλ₯Ό λ°”κΏ” μ“°λ©΄ 문제 없이 μ‹€ν–‰λ˜λ©°,

첫 번째 catchκ°€ μ‹€ν–‰λœλ‹€.

πŸ“– μ˜ˆμ™Έμ˜ μ’…λ₯˜

μ˜ˆμ™Έμ˜ μ’…λ₯˜λŠ” 총 3가지이닀.

1. Error
2. Checked Exception
3. Runtime Exception (Unchecked Exception 이라고도 함)

<Error>
μžλ°” ν”„λ‘œκ·Έλž¨ λ°–μ—μ„œ λ°œμƒν•œ 문제둜, μ‹œμŠ€ν…œ λ ˆλ²¨μ—μ„œ λ°œμƒν•˜λŠ” μ‹¬κ°ν•œ 문제λ₯Ό μ˜λ―Έν•œλ‹€.
예λ₯Ό λ“€μ–΄, λ””μŠ€ν¬ κ³ μž₯, λ©”λͺ¨λ¦¬ λΆ€μ‘± λ“±μ˜ ν•˜λ“œμ›¨μ–΄λ‚˜ μ‹œμŠ€ν…œ 였λ₯˜κ°€ μžˆλ‹€.
ν”„λ‘œκ·Έλž¨μ—μ„œ μ΄λŸ¬ν•œ 였λ₯˜λ₯Ό μ˜ˆμΈ‘ν•˜κ±°λ‚˜ λ³΅κ΅¬ν•˜κΈ° μ–΄λ ΅λ‹€.

<Checked Exception>
컴파일 μ‹œμ μ—μ„œ μ˜ˆμ™Έ 처리 μ—¬λΆ€λ₯Ό κ²€μ‚¬ν•˜λŠ” μ˜ˆμ™Έλ‘œ, λ°˜λ“œμ‹œ μ˜ˆμ™Έ 처리λ₯Ό ν•΄μ•Ό ν•œλ‹€.
파일 μž…μΆœλ ₯μ΄λ‚˜ λ„€νŠΈμ›Œν¬ μ—°κ²° μ‹œ λ°œμƒν•  수 μžˆλŠ” μ˜ˆμ™Έκ°€ 이에 ν•΄λ‹Ήν•œλ‹€.
예λ₯Ό λ“€μ–΄, `IOException`, `SQLException` 등이 μžˆλ‹€.

<Runtime Exception (Unchecked Exception)>
μ‹€ν–‰ μ‹œμ μ—μ„œ λ°œμƒν•˜λŠ” μ˜ˆμ™Έλ‘œ, ν”„λ‘œκ·Έλž¨μ˜ 논리적 였λ₯˜λ‚˜ 잘λͺ»λœ μž…λ ₯으둜 인해 λ°œμƒν•œλ‹€.
예λ₯Ό λ“€μ–΄, 잘λͺ»λœ 값을 μž…λ ₯ν•˜κ±°λ‚˜, λ°°μ—΄μ˜ 인덱슀λ₯Ό λ²—μ–΄λ‚˜λŠ” κ²½μš°κ°€ 이에 ν•΄λ‹Ήν•œλ‹€.
예λ₯Ό λ“€μ–΄, `NullPointerException`, `ArrayIndexOutOfBoundsException` 등이 μžˆλ‹€.

*** 배열은 μ™œ?
배열에 λŒ€ν•œ μ˜ˆμ™ΈλŠ” 반볡문과 λ³€μˆ˜λ₯Ό ν†΅ν•œ 인덱슀 접근이 μ‚¬μš© 쀑에 κ²°μ •λ˜κΈ° λ•Œλ¬Έμ— 컴파일 μ‹œμ μ— μ˜ˆμΈ‘ν•˜κΈ° μ–΄λ ΅λ‹€.
λ”°λΌμ„œ λ°°μ—΄ 인덱슀λ₯Ό μ΄ˆκ³Όν•˜λŠ” 접근은 λŸ°νƒ€μž„μ— κ²€μΆœλœλ‹€.

λ˜ν•œ, 크기가 κ³ μ •λœ 배열에 λŒ€ν•΄ λͺ…ν™•νžˆ μ•Œ 수 μžˆλŠ” 인덱슀 초과 μ˜ˆμ™Έ
(예: 5μΉΈ 짜리 배열에 arr[6]으둜 μ ‘κ·Ό)λŠ” μ»΄νŒŒμΌλŸ¬κ°€ 감지할 수 μžˆμ§€λ§Œ,
μžλ°”λŠ” 일관성을 μœ μ§€ν•˜κΈ° μœ„ν•΄ λͺ¨λ“  λ°°μ—΄ 인덱슀 초과 μ˜ˆμ™Έλ₯Ό λŸ°νƒ€μž„ μ˜ˆμ™Έλ‘œ μ²˜λ¦¬ν•œλ‹€.

πŸ’» Throwable 클래슀

The Throwable class is the superclass of all errors and exceptions in the Java language.

πŸ“– κΈ°λŠ₯

<μƒμ„±μž>

- Throwable()
- Throwable(String message) : μ˜ˆμ™Έμ— λŒ€ν•œ ꡬ체적인 상황을 μ„€λͺ…
- Throwable(Throwable cause) : μ˜ˆμ™Έμ— 원인을 λ„˜κ²¨μ€Œ
- Throwable(String message, Throwable cause)

<λ§€μ†Œλ“œ>
κ°€μž₯ 많이 μ‚¬μš©λ˜λŠ” 3κ°€μ§€λ§Œ μ•Œμ•„λ³΄μž

1. getMessange()
- μ˜ˆμ™Έ λ©”μ‹œμ§€λ₯Ό μ œκ³΅λ°›λŠ”λ‹€. μ˜ˆμ™Έ 좜λ ₯ μ‹œ μ–΄λ–€ μ˜ˆμ™Έκ°€ λ°œμƒν–ˆλŠ”μ§€ ν™•μΈν•˜κΈ° μœ μš©ν•˜λ‹€.
- μƒμ„±μž 호좜 μ‹œ λ„˜κ²¨μ€€ messageλ₯Ό λ°˜ν™˜ν•œλ‹€.

2. toString()
- getMessage처럼 μ˜ˆμ™Έ λ©”μ‹œμ§€λ₯Ό λŒλ €λ°›μ§€λ§Œ μΆ”κ°€μ μœΌλ‘œ μ˜ˆμ™Έ 클래슀 이름도 μ œκ³΅ν•œλ‹€.

3. printStackTrace()
- κ°€μž₯ 첫 쀄에 μ˜ˆμ™Έ λ©”μ‹œμ§€ 좜λ ₯ ν›„ 두 λ²ˆμ§ΈλΆ€ν„° μ˜ˆμ™Έκ°€ λ°œμƒν•˜κ²Œ 된 λ©”μ„œλ“œλ“€μ˜ 호좜 관계λ₯Ό 좜λ ₯ν•΄μ€€λ‹€.
πŸ“„ μ˜ˆμ‹œ
package chapter14;

public class ThrowablePrac {
    public static void

 main(String[] args) {
        try {
            methodThatThrowsException();
        } catch (Exception e) {
            System.out.println("Exception caught(use getMessage): " + e.getMessage());
            System.out.println("Exception caught(use toString): " + e.toString());
            e.printStackTrace();
        }
    }

    public static void methodThatThrowsException() throws Exception {
        throw new Exception("Custom error message");
    }
}

이런 μ½”λ“œκ°€ μžˆλ‹€κ³  ν•΄λ³΄μž.

μ‹€ν–‰ μ‹œ 이런 λ¬Έμž₯이 좜λ ₯되며

e.printStackTraceμ—μ„œλŠ” λ¬Έμ œκ°€ λ°œμƒν•œ λ©”μ„œλ“œμ™€ 호좜된 ꡬ간이 λ‚˜μ˜¨λ‹€.

πŸ“– throw와 throws

throwλŠ” μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¨λ‹€.
throw new μ˜ˆμ™Έμƒν™© 으둜 μ“°λ©°
μ›ν•˜λŠ” 쑰건을 νŠΉμ •ν•œ μ˜ˆμ™Έλ‘œ 포함(λ˜μ§„λ‹€)μ‹œν‚¨λ‹€.

public class throwAndThrows {
    public static void main(String[] args) {
        throwAndThrows sample = new throwAndThrows();

        sample.throwException(7);
        sample.throwException(13);
    }

    public void throwException(int number) {
        try {
            if (number > 12) {
                throw new Exception("Number is over than 12!");
            } // 이제 μˆ«μžκ°€ 12보닀 큰 것은 Exception에 ν¬ν•¨λœλ‹€.

            System.out.println("Number is " + number);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

μœ„ μ½”λ“œμ—μ„œμ²˜λŸΌ μ‚¬μš©ν•˜λ©° 12κ°€ λ„˜μ–΄κ°ˆ λ•ŒλŠ” Exception으둜 μ²˜λ¦¬λœλ‹€.
그렇기에 catch둜 λ°”λ‘œ λ„˜μ–΄κ°€ 였λ₯˜ ꡬ문을 좜λ ₯ν•œλ‹€.

이처럼 μ›ν•˜λŠ” 상황을 "μ˜ˆμ™Έ"둜 λ§Œλ“€μ–΄ μ²˜λ¦¬κ°€ κ°€λŠ₯ν•˜λ‹€.

"μ˜ˆμ™Έ"둜 λ§Œλ“  상황을 μ²˜λ¦¬ν•  λ•ŒλŠ”
1. λ‚΄κ°€ 직접 μ²˜λ¦¬ν•œλ‹€.
2. λ‚˜λ₯Ό ν˜ΈμΆœν•œ μƒμœ„ λ©”μ„œλ“œμ— λ„˜κ²¨μ€€λ‹€.

이 두 κ°€μ§€λ‘œ 닀룬닀.
λ‚΄κ°€ 직접 ν•΄κ²°ν•  λ•ŒλŠ” try-catchλ₯Ό 톡해 ν•΄λ‹Ή λ©”μ„œλ“œ λ‚΄μ—μ„œ ν•΄κ²°ν•œλ‹€.

ν•˜μ§€λ§Œ λ§Œμ•½ μƒμœ„ λ©”μ„œλ“œμ—μ„œ 처리λ₯Ό ν•˜κ²Œ ν•œλ‹€λ©΄ throwsλ₯Ό 톡해 λ„˜κ²¨μ€˜μ•Ό ν•œλ‹€.

throwsλŠ” λ©”μ„œλ“œ 이름 μ˜†μ— λΆ™μœΌλ©° 이 λ©”μ„œλ“œλŠ” μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€λ‹ˆ 잘 μ²˜λ¦¬ν•΄μ„œ μ“°μ„Έμš”λΌλŠ” λœ»μ„ 가지고 μžˆλ‹€.

예λ₯Ό λ“€μ–΄λ³΄μž

public class throwAndThrows {
    public static void main(String[] args) {
        throwAndThrows sample = new throwAndThrows();

        try {
            sample.test2();
        } catch (Exception e) {
            System.out.println("test1μ—μ„œ λ°œμƒν•œ μ˜ˆμ™Έκ°€ test2λ₯Ό 거쳐 μ²˜λ¦¬λ©λ‹ˆλ‹€.");
        }
    }

    public void test1() throws Exception {
        throw new Exception("μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œμΌœ μƒμœ„ λ©”μ„œλ“œλ‘œ λ„˜κΉλ‹ˆλ‹€.");
    }

    public void test2() throws Exception {
        test1(); // test1을 ν˜ΈμΆœν•˜μ§€λ§Œ 직접 ν•΄κ²°ν•  λŠ₯λ ₯이 μ—†μ–΄ 더 μƒμœ„λ‘œ λ„˜κ²¨μ€λ‹ˆλ‹€.
    }
}

μ•„λž˜μ™€ 같이 μ‚¬μš©ν•˜λŠ”λ° μ›ν•˜λŠ” 상황을 μ˜ˆμ™Έλ‘œ λ§Œλ“€μ—ˆμ§€λ§Œ
λ‚΄κ°€ μ²˜λ¦¬ν•˜μ§€ λͺ»ν•  λ•Œ throwsλ₯Ό 톡해 μƒμœ„ λ©”μ„œλ“œλ‘œ λ„˜κ²¨μ€€ ν›„ μƒμœ„ λ©”μ„œλ“œμ—μ„œ try-catch둜 μ²˜λ¦¬ν•œλ‹€.

πŸ“– λ‚΄κ°€ λ§Œλ“œλŠ” μ˜ˆμ™Έ

throw와 throwsλŠ” 이미 μ‘΄μž¬ν•˜λŠ” μ˜ˆμ™Έμ— λ‚΄κ°€ μ›ν•˜λŠ” 쑰건을 μΆ”κ°€ν•˜λŠ” 것이닀.
ν•˜μ§€λ§Œ 이것 말고도 λ‚΄κ°€ μ›ν•˜λŠ” μ˜ˆμ™Έ 상황을 λ§Œλ“€ μˆ˜λ„ μžˆλ‹€.
즉, μƒˆλ‘œμš΄ μ˜ˆμ™Έ classλ₯Ό λ§Œλ“€ 수 μžˆλ‹€.

μ•žμ„œ Throwable ν΄λž˜μŠ€μ—λŠ” Exceptionκ³Ό ErrorλΌλŠ” μžμ‹ ν΄λž˜μŠ€κ°€ μ‘΄μž¬ν•œλ‹€κ³  ν–ˆλ‹€.

이쀑 Error ν΄λž˜μŠ€λŠ” μ‚¬μš©μžκ°€ 손을 λŒ€λ©΄ μ•ˆ λœλ‹€.
Errorκ°€ μ•„λ‹Œ Exception ν΄λž˜μŠ€λŠ” κ°œλ°œμžκ°€ μž„μ˜λ‘œ μΆ”κ°€ν•  수 μžˆλ‹€.
public class MyException extends Exception {
    public MyException() {
        super();
    }

    public MyException(String message) {
        super(message);
    }
}

public class CustomExceptionPrac {
    public static void main(String[] args) {
        CustomExceptionPrac sample = new CustomExceptionPrac();

        try {
            sample.throwMyException();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void throwMyException() throws MyException {
        throw new MyException("Custom exception message");
    }
}

μœ„μ²˜λŸΌ μ˜ˆμ™Έλ₯Ό 상속받은 클래슀λ₯Ό ν˜ΈμΆœν•˜μ—¬ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€.

μž₯μ μœΌλ‘œλŠ”
1. μ’€ 더 λͺ…ν™•ν•˜κ²Œ μ˜μ‚¬ 전달이 κ°€λŠ₯ν•˜λ‹€.
2. ꡬ체적인 μ˜ˆμ™Έ μ²˜λ¦¬κ°€ κ°€λŠ₯ν•˜λ‹€.

등이 μžˆλ‹€.

πŸ’» Runtime vs Checked

μžλ°”μ—μ„œλŠ” μ˜ˆμ™Έλ₯Ό 두 가지 μ£Όμš” λ²”μ£Όλ‘œ λ‚˜λˆˆλ‹€: 
Checked Exception(체크 μ˜ˆμ™Έ)와 Runtime Exception(λŸ°νƒ€μž„ μ˜ˆμ™Έ). 
이 두 가지 μ˜ˆμ™ΈλŠ” 처리 방식과 μ‚¬μš© λͺ©μ μ΄ λ‹€λ₯΄λ‹€.

πŸ“– 체크 μ˜ˆμ™Έ (Checked Exception)

체크 μ˜ˆμ™ΈλŠ” 컴파일 μ‹œμ μ—μ„œ μ˜ˆμ™Έ 처리 μ—¬λΆ€λ₯Ό κ²€μ‚¬ν•˜λŠ” μ˜ˆμ™Έλ‹€. 
μ΄λŸ¬ν•œ μ˜ˆμ™ΈλŠ” λ°˜λ“œμ‹œ μ˜ˆμ™Έ 처리λ₯Ό ν•΄μ•Ό ν•œλ‹€. 파일 μž…μΆœλ ₯μ΄λ‚˜ λ„€νŠΈμ›Œν¬ μ—°κ²° μ‹œ λ°œμƒν•  수 μžˆλŠ” μ˜ˆμ™Έκ°€ 이에 ν•΄λ‹Ήν•œλ‹€. 
`IOException`, `SQLException` 등이 μžˆλ‹€.

체크 μ˜ˆμ™ΈλŠ” λ©”μ„œλ“œ 선언뢀에 `throws` ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ„ μ–Έν•΄μ•Ό ν•œλ‹€. 
μ΄λŠ” λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” μͺ½μ—μ„œ ν•΄λ‹Ή μ˜ˆμ™Έλ₯Ό λ°˜λ“œμ‹œ μ²˜λ¦¬ν•΄μ•Ό ν•œλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€. 
μ΄λŸ¬ν•œ μ˜ˆμ™ΈλŠ” 주둜 μ™ΈλΆ€ μžμ›κ³Όμ˜ μƒν˜Έμž‘μš©μ—μ„œ λ°œμƒν•  수 μžˆλŠ” 였λ₯˜λ₯Ό μ²˜λ¦¬ν•˜λŠ” 데 μ‚¬μš©λœλ‹€.

πŸ“– λŸ°νƒ€μž„ μ˜ˆμ™Έ (Runtime Exception)

λŸ°νƒ€μž„ μ˜ˆμ™ΈλŠ” μ‹€ν–‰ μ‹œμ μ—μ„œ λ°œμƒν•˜λŠ” μ˜ˆμ™Έλ‘œ, ν”„λ‘œκ·Έλž¨μ˜ 논리적 였λ₯˜λ‚˜ 잘λͺ»λœ μž…λ ₯으둜 인해 λ°œμƒν•œλ‹€. 
예λ₯Ό λ“€μ–΄, 잘λͺ»λœ 값을 μž…λ ₯ν•˜κ±°λ‚˜, λ°°μ—΄μ˜ 인덱슀λ₯Ό λ²—μ–΄λ‚˜λŠ” κ²½μš°κ°€ 이에 ν•΄λ‹Ήν•œλ‹€. 
`NullPointerException`, `ArrayIndexOutOfBoundsException` 등이 μžˆλ‹€.

λŸ°νƒ€μž„ μ˜ˆμ™ΈλŠ” λ©”μ„œλ“œ 선언뢀에 `throws` ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ„ μ–Έν•˜μ§€ μ•Šμ•„λ„ λœλ‹€. 
μ˜ˆμ™Έ 처리λ₯Ό κ°•μ œν•˜μ§€ μ•ŠμœΌλ―€λ‘œ, ν•„μš”ν•œ κ²½μš°μ—λ§Œ `try-catch` 블둝을 μ‚¬μš©ν•˜μ—¬ μ²˜λ¦¬ν•œλ‹€. 
μ΄λŠ” 주둜 ν”„λ‘œκ·Έλž˜λ° 였λ₯˜λ‚˜ 논리적 였λ₯˜λ₯Ό μ²˜λ¦¬ν•˜λŠ” 데 μ‚¬μš©λœλ‹€.

πŸ“– 체크 μ˜ˆμ™Έμ™€ λŸ°νƒ€μž„ μ˜ˆμ™Έμ˜ 비ꡐ

체크 μ˜ˆμ™ΈλŠ” μ™ΈλΆ€ μžμ›κ³Όμ˜ μƒν˜Έμž‘μš©μ—μ„œ λ°œμƒν•  수 μžˆλŠ” 였λ₯˜λ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λ©°, 
λ°˜λ“œμ‹œ μ˜ˆμ™Έ 처리λ₯Ό ν•΄μ•Ό ν•œλ‹€. 
반면, λŸ°νƒ€μž„ μ˜ˆμ™ΈλŠ” ν”„λ‘œκ·Έλž¨μ˜ 논리적 였λ₯˜λ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λ©°, μ˜ˆμ™Έ 처리λ₯Ό κ°•μ œν•˜μ§€ μ•ŠλŠ”λ‹€.

체크 μ˜ˆμ™ΈλŠ” μ˜ˆμ™Έ λ°œμƒ κ°€λŠ₯성이 높은 μ™ΈλΆ€ μžμ› μ ‘κ·Ό μ½”λ“œμ—μ„œ μ‚¬μš©ν•˜κ³ ,
λŸ°νƒ€μž„ μ˜ˆμ™ΈλŠ” 논리적 였λ₯˜λ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•œλ‹€. 
이λ₯Ό 톡해 μ½”λ“œμ˜ 가독성과 μœ μ§€λ³΄μˆ˜μ„±μ„ ν–₯μƒμ‹œν‚€κ³ , μ˜ˆμ™Έ 상황을 보닀 효과적으둜 μ²˜λ¦¬ν•  수 μžˆλ‹€.

μš”μ•½

체크 μ˜ˆμ™Έμ™€ λŸ°νƒ€μž„ μ˜ˆμ™ΈλŠ” 각각의 μ‚¬μš© λͺ©μ κ³Ό 처리 방식이 λ‹€λ₯΄λ‹€. 
체크 μ˜ˆμ™ΈλŠ” 컴파일 μ‹œμ μ—μ„œ μ˜ˆμ™Έ 처리 μ—¬λΆ€λ₯Ό κ²€μ‚¬ν•˜λ©°, λ°˜λ“œμ‹œ μ˜ˆμ™Έ 처리λ₯Ό ν•΄μ•Ό ν•œλ‹€. 
λŸ°νƒ€μž„ μ˜ˆμ™ΈλŠ” μ‹€ν–‰ μ‹œμ μ—μ„œ λ°œμƒν•˜λ©°, μ˜ˆμ™Έ 처리λ₯Ό κ°•μ œν•˜μ§€ μ•ŠλŠ”λ‹€. 
profile
학생

0개의 λŒ“κΈ€