๐Ÿ› ๏ธ Java ์˜ˆ์™ธ ์ฒ˜๋ฆฌ (Exception Handling)

์„ํ˜„ยท2025๋…„ 2์›” 1์ผ
0

Insight

๋ชฉ๋ก ๋ณด๊ธฐ
6/43

์˜ค๋Š˜์˜ ์ด์•ผ๊ธฐ

์ž๋ฐ”๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋ฉด ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘ ์˜ˆ์™ธ(Exception)๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ๊ทผ
์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ๋” ์•ˆ์ •์ ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์„์ง€ ๊ณ ๋ฏผํ•˜๋˜ ์ค‘, Checked Exception๊ณผ Unchecked Exception์˜ ์ฐจ์ด๋ฅผ ๋‹ค์‹œ๊ธˆ ์ •๋ฆฌํ•ด๋ณด๋ฉด ์ข‹๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์ž๋ฐ”์˜ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๊ฐœ๋…๊ณผ ํ™œ์šฉ ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


์˜ˆ์™ธ(Exception)๋ž€? ๐Ÿค”

์˜ˆ์™ธ(Exception)๋Š” ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์˜ค๋ฅ˜๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์™ธ๊ฐ€ ์ ์ ˆํžˆ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์œผ๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ๋น„์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž๋ฐ”์˜ ์˜ˆ์™ธ๋Š” ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค:
1. Checked Exception (๊ฒ€์‚ฌ ์˜ˆ์™ธ) โ€“ ๋ฐ˜๋“œ์‹œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์˜ˆ์™ธ
2. Unchecked Exception (๋น„๊ฒ€์‚ฌ ์˜ˆ์™ธ) โ€“ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์•„๋„ ์ปดํŒŒ์ผ์ด ๊ฐ€๋Šฅํ•œ ์˜ˆ์™ธ

๋˜ํ•œ, Error์™€ Exception์˜ ์ฐจ์ด๋„ ์•Œ์•„๋‘๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. Error๋Š” ์‹œ์Šคํ…œ ๋ ˆ๋ฒจ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์ด๋ฉฐ, ์ผ๋ฐ˜์ ์œผ๋กœ ๋ณต๊ตฌ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด Exception์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ฒ˜๋ฆฌํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์ด ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


Checked Exception ๐Ÿง

Checked Exception์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ•์ œํ•˜๋Š” ์˜ˆ์™ธ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์˜ˆ์™ธ๋ฅผ try-catch๋กœ ๊ฐ์‹ธ๊ฑฐ๋‚˜ throws๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜ธ์ถœ์ž์—๊ฒŒ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ๋„˜๊ฒจ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฃผ๋กœ ์™ธ๋ถ€ ํ™˜๊ฒฝ๊ณผ์˜ ์ƒํ˜ธ์ž‘์šฉ์—์„œ ๋ฐœ์ƒํ•˜๋ฉฐ, ํŒŒ์ผ ์ž…์ถœ๋ ฅ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ, ๋„คํŠธ์›Œํฌ ํ†ต์‹  ๋“ฑ์˜ ์ž‘์—…์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… ๋Œ€ํ‘œ์ ์ธ Checked Exception

  • IOException โ€“ ํŒŒ์ผ ์ž…์ถœ๋ ฅ ๊ด€๋ จ ์˜ค๋ฅ˜
  • SQLException โ€“ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘๊ทผ ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜
  • ClassNotFoundException โ€“ ํด๋ž˜์Šค ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ

๐Ÿ’ป ์˜ˆ์ œ ์ฝ”๋“œ: ํŒŒ์ผ ์ฝ๊ธฐ (IOException ์ฒ˜๋ฆฌ)

import java.io.*;

public class FileReaderExample {
    public void readFile(String fileName) throws IOException {
        FileReader file = new FileReader(fileName);
        BufferedReader reader = new BufferedReader(file);
        String line;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
        reader.close();
    }
}

throws IOException์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฉ”์„œ๋“œ๋กœ ์œ„์ž„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


Unchecked Exception โš ๏ธ

Unchecked Exception์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ•์ œํ•˜์ง€ ์•Š๋Š” ์˜ˆ์™ธ์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„ ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์‹ค์ˆ˜๋‚˜ ๋…ผ๋ฆฌ์  ์˜ค๋ฅ˜๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋ฉฐ, ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘(Runtime) ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์˜ˆ์™ธ๋“ค์€ ๋Œ€๋ถ€๋ถ„ RuntimeException์„ ์ƒ์†๋ฐ›์œผ๋ฉฐ, ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š์•„๋„ ์ปดํŒŒ์ผ์ด ๋˜์ง€๋งŒ ์‹คํ–‰ ์‹œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… ๋Œ€ํ‘œ์ ์ธ Unchecked Exception

  • NullPointerException โ€“ null ๊ฐ’์„ ์ฐธ์กฐํ•  ๋•Œ ๋ฐœ์ƒ
  • ArrayIndexOutOfBoundsException โ€“ ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋ฅผ ์ดˆ๊ณผํ•˜์—ฌ ์ ‘๊ทผํ•  ๋•Œ ๋ฐœ์ƒ
  • IllegalArgumentException โ€“ ์ž˜๋ชป๋œ ์ธ์ž๋ฅผ ๋ฉ”์„œ๋“œ์— ์ „๋‹ฌํ•  ๋•Œ ๋ฐœ์ƒ

๐Ÿ’ป ์˜ˆ์ œ ์ฝ”๋“œ: NullPointerException ์ฒ˜๋ฆฌ

public class NullPointerExample {
    public void printLength(String str) {
        if (str == null) {
            throw new NullPointerException("๋ฌธ์ž์—ด์ด null์ž…๋‹ˆ๋‹ค!");
        }
        System.out.println(str.length());
    }
}

๋ฌธ์ž์—ด์ด null์ผ ๊ฒฝ์šฐ NullPointerException์ด ๋ฐœ์ƒํ•˜๋ฏ€๋กœ, ์‚ฌ์ „์— ์ฒดํฌํ•˜์—ฌ ์˜ˆ์™ธ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


Checked Exception vs. Unchecked Exception ๋น„๊ต ๐Ÿ†š

๊ตฌ๋ถ„Checked ExceptionUnchecked Exception
ํ™•์ธ ์‹œ์ ์ปดํŒŒ์ผ ์‹œ์ ์‹คํ–‰ ์‹œ์ (Runtime)
์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์—ฌ๋ถ€๋ฐ˜๋“œ์‹œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•จ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ•์ œ๋˜์ง€ ์•Š์Œ
๋ฐœ์ƒ ์›์ธํŒŒ์ผ I/O, DB ์—ฐ๊ฒฐ ๋“ฑ ์™ธ๋ถ€ ์š”์†Œํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์‹ค์ˆ˜, ๋…ผ๋ฆฌ์  ์˜ค๋ฅ˜
๋Œ€ํ‘œ์ ์ธ ์˜ˆ์™ธIOException, SQLExceptionNullPointerException, IndexOutOfBoundsException

Custom Exception (์‚ฌ์šฉ์ž ์ •์˜ ์˜ˆ์™ธ) ๐Ÿ—๏ธ

๊ธฐ๋ณธ ์ œ๊ณต๋˜๋Š” ์˜ˆ์™ธ๋งŒ์œผ๋กœ๋Š” ์˜๋ฏธ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ „๋‹ฌํ•˜๊ธฐ ์–ด๋ ค์šด ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿด ๋•Œ ์‚ฌ์šฉ์ž ์ •์˜ ์˜ˆ์™ธ(Custom Exception)๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’ป ์˜ˆ์ œ ์ฝ”๋“œ: ์‚ฌ์šฉ์ž ์ •์˜ ์˜ˆ์™ธ ๋งŒ๋“ค๊ธฐ

class InvalidAgeException extends Exception {
    public InvalidAgeException(String message) {
        super(message);
    }
}

public class CustomExceptionExample {
    public void checkAge(int age) throws InvalidAgeException {
        if (age < 18) {
            throw new InvalidAgeException("18์„ธ ์ด์ƒ๋งŒ ์ด์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.");
        }
    }
}

InvalidAgeException์„ ๋งŒ๋“ค์–ด ํŠน์ • ๋กœ์ง(์˜ˆ: ์—ฐ๋ น ์ œํ•œ)์—์„œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ชจ๋ฒ” ์‚ฌ๋ก€ โœ…

  1. ์ ์ ˆํ•œ ์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ โ€“ ๋ชจ๋“  ์˜ˆ์™ธ๋ฅผ Exception์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ง๊ณ , ์˜๋ฏธ์— ๋งž๋Š” ์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  2. ์˜ˆ์™ธ ๋ฉ”์‹œ์ง€๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ œ๊ณตํ•˜๋ผ โ€“ ์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋Š”์ง€ ๋ช…ํ™•ํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ํฌํ•จํ•˜์„ธ์š”.
  3. try-catch๋ฅผ ๋‚จ์šฉํ•˜์ง€ ๋งˆ๋ผ โ€“ ๋ถˆํ•„์š”ํ•œ try-catch ๋ธ”๋ก์„ ๋‚จ๋ฐœํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. ์‚ฌ์šฉ์ž ์ •์˜ ์˜ˆ์™ธ๋ฅผ ํ™œ์šฉํ•˜๋ผ โ€“ ํŠน์ •ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ๋งž๋Š” ์˜ˆ์™ธ๋ฅผ ์ •์˜ํ•˜์—ฌ ๊ฐ€๋…์„ฑ์„ ๋†’์ด์„ธ์š”.
  5. ์ตœ์ƒ์œ„์—์„œ ์˜ˆ์™ธ๋ฅผ ๋กœ๊น…ํ•˜๋ผ โ€“ ๋ชจ๋“  ์˜ˆ์™ธ๋ฅผ ๋ฌด์‹œํ•˜์ง€ ๋ง๊ณ , ๋กœ๊ทธ๋ฅผ ๋‚จ๊ฒจ ๋””๋ฒ„๊น…ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“œ์„ธ์š”.

๋งˆ์น˜๋ฉฐ ๐ŸŒŸ

์ž๋ฐ”์˜ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ์ค‘์š”ํ•œ ์š”์†Œ์ž…๋‹ˆ๋‹ค. Checked Exception๊ณผ Unchecked Exception์˜ ์ฐจ์ด๋ฅผ ์ดํ•ดํ•˜๊ณ , ์ƒํ™ฉ์— ๋งž๊ฒŒ ์ ์ ˆํ•œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ์ ์šฉํ•˜๋ฉด ๋”์šฑ ์•ˆ์ •์ ์ธ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ์—ฌ๋Ÿฌ๋ถ„๋„ ํšจ์œจ์ ์ธ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ์ ์šฉํ•˜์—ฌ ์•ˆ์ •์ ์ธ ์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•ด ๋ณด์„ธ์š”! ๐Ÿš€


ํƒœ๊ทธ: Java, Exception Handling, Checked Exception, Unchecked Exception, Custom Exception

0๊ฐœ์˜ ๋Œ“๊ธ€