๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โŒจ๏ธ Language/Java

[Java] ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์™„์ „ ์ •๋ณต โ‘ก : throw, throws์™€ ์‚ฌ์šฉ์ž ์ •์˜ ์˜ˆ์™ธ ํด๋ž˜์Šค

by hyebin (Helia) 2025. 5. 17.
๋ฐ˜์‘ํ˜•

 


๋ชฉ์ฐจ

     

     

    ํ”„๋กœ๊ทธ๋žจ์„ ๋” ๊ฒฌ๊ณ ํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹จ์ˆœํžˆ ์˜ˆ์™ธ๋ฅผ ์žก๋Š” ๊ฒƒ์„ ๋„˜์–ด, ์˜ˆ์™ธ๋ฅผ ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉํ•˜๊ณ  ์„ค๊ณ„ํ•  ์ค„ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์˜ˆ์™ธ๋ฅผ ๋‹ค๋ฃจ๊ณ  ์ƒํ™ฉ์— ๋งž๋Š” ์ปค์Šคํ…€ ์˜ˆ์™ธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์‹ค๋ฌด์—์„œ ๋งค์šฐ ์ค‘์š”ํ•œ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.

     

    ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” throw์™€ throws ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•œ ์˜ˆ์™ธ ์ œ์–ด ๋ฐฉ๋ฒ•๊ณผ ์‚ฌ์šฉ์ž ์ •์˜ ์˜ˆ์™ธ ํด๋ž˜์Šค ์ƒ์„ฑ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


    ๐Ÿ”ท throw์™€ throws ํ‚ค์›Œ๋“œ

    throw๋ž€?

    throw๋Š” ์˜ˆ์™ธ ๊ฐ์ฒด๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ํ‚ค์›Œ๋“œ์ž…๋‹ˆ๋‹ค.

    ํŠน์ • ์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜์ง€ ์•Š์•˜์„ ๋•Œ ํ”„๋กœ๊ทธ๋žจ์˜ ํ๋ฆ„์„ ์ค‘๋‹จํ•˜๊ณ  ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋กœ์ง์œผ๋กœ ์ œ์–ด๋ฅผ ๋„˜๊ธฐ๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

    public class ThrowExample {
        public static void main(String[] args) {
            int age = -1;
    
            if (age < 0) {
                throw new IllegalArgumentException("๋‚˜์ด๋Š” ์Œ์ˆ˜๊ฐ€ ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
            }
        }
    }
    ๐Ÿ’ก ์˜ˆ์™ธ ๊ฐ์ฒด๋Š” RuntimeException ๊ณ„์—ด์ด๊ฑฐ๋‚˜, ์•„๋‹ˆ๋ผ๋ฉด throws๋กœ ์„ ์–ธํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

     

     

    throws๋ž€?

    throws๋Š” ๋ฉ”์„œ๋“œ ์„ ์–ธ๋ถ€์— ์‚ฌ์šฉ๋˜๋ฉฐ, ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ํŠน์ • ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Œ์„ ์•Œ๋ ค์ฃผ๋Š” ์„ ์–ธ์ž…๋‹ˆ๋‹ค.

    ์ง์ ‘ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ณ  ํ˜ธ์ถœํ•œ ์ชฝ์—์„œ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๋– ๋„˜๊ธธ ์ˆ˜ ์žˆ์–ด์š”.

    public void readFile() throws IOException {
        FileReader fr = new FileReader("data.txt");
    }
    ์˜ˆ์™ธ๋ฅผ ์œ„์ž„ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ชฝ์—์„œ๋Š” ๋ฐ˜๋“œ์‹œ try-catch ๋˜๋Š” ๋‹ค์‹œ throws๋กœ ์˜ˆ์™ธ๋ฅผ ๋„˜๊ฒจ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

     

    throws๋Š” ์ฃผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค

    1. ๋ฉ”์„œ๋“œ๊ฐ€ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ •๋ณด๋‚˜ ๊ถŒํ•œ์ด ๋ถ€์กฑํ•  ๋•Œ
    2. ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ฑ…์ž„์„ ํ˜ธ์ถœ์ž์—๊ฒŒ ์œ„์ž„ํ•˜๊ณ  ์‹ถ์„ ๋•Œ
    3. ์—ฌ๋Ÿฌ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ํ†ตํ•ฉํ•˜์—ฌ ํ•œ ๊ณณ์—์„œ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ

     

    throw vs throws ์ •๋ฆฌ

    ํ•ญ๋ชฉ throw throws
    ์˜๋ฏธ ์˜ˆ์™ธ๋ฅผ ์‹ค์ œ๋กœ ๋ฐœ์ƒ์‹œํ‚ด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ์„ ์„ ์–ธ
    ์œ„์น˜ ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ ์„ ์–ธ๋ถ€
    ๋Œ€์ƒ ์˜ˆ์™ธ ๊ฐ์ฒด 1๊ฐœ๋งŒ ๊ฐ€๋Šฅ ์˜ˆ์™ธ ํด๋ž˜์Šค ์—ฌ๋Ÿฌ ๊ฐœ ์„ ์–ธ ๊ฐ€๋Šฅ
    ์‚ฌ์šฉ ์˜ˆ throw new IllegalArgumentException() public void method() throws IOException
    ๐Ÿ’ก throws๋Š” ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜์˜ ์ผ๋ถ€๋กœ, ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ์–ด๋–ค ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.
    ๋ฐ˜๋ฉด throw๋Š” ์‹ค์ œ๋กœ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ์‹คํ–‰๋ฌธ์ž…๋‹ˆ๋‹ค.

    ๐Ÿ‘ค ์‚ฌ์šฉ์ž ์ •์˜ ์˜ˆ์™ธ ํด๋ž˜์Šค

    ์™œ ์‚ฌ์šฉ์ž ์˜ˆ์™ธ๊ฐ€ ํ•„์š”ํ•œ๊ฐ€?

    ๊ธฐ๋ณธ ์ œ๊ณต ์˜ˆ์™ธ ํด๋ž˜์Šค๋งŒ์œผ๋กœ๋Š” ๋ชจ๋“  ์ƒํ™ฉ์„ ์„ค๋ช…ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

    ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ๋งž๋Š” ๋ช…ํ™•ํ•œ ์˜ˆ์™ธ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์•ผ ์ฝ”๋“œ๊ฐ€ ๋” ๋ช…ํ™•ํ•ด์ง€๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›Œ์ ธ์š”.

     

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


    ์‚ฌ์šฉ์ž ์˜ˆ์™ธ ๋งŒ๋“ค๊ธฐ – extends Exception or RuntimeException

    Java์—์„œ๋Š” ์˜ˆ์™ธ ํด๋ž˜์Šค๋Š” ๋ฐ˜๋“œ์‹œ Exception ๋˜๋Š” RuntimeException์„ ์ƒ์†ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

     

    Checked ์‚ฌ์šฉ์ž ์ •์˜ ์˜ˆ์™ธ (Exception ์ƒ์†)

    public class LoginFailException extends Exception {
        public LoginFailException(String message) {
            super(message);
        }
    }
    • ํ˜ธ์ถœ์ž๊ฐ€ ์˜ˆ์™ธ ์ƒํ™ฉ์—์„œ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ
    • ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ฐ€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ธ ๊ฒฝ์šฐ
    • API ์‚ฌ์šฉ์ž์—๊ฒŒ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ•์ œํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ

     

     

    Unchecked ์‚ฌ์šฉ์ž ์ •์˜ ์˜ˆ์™ธ (RuntimeException ์ƒ์†)

    public class InvalidAgeException extends RuntimeException {
        public InvalidAgeException(String message) {
            super(message);
        }
    }
    • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์˜ค๋ฅ˜์— ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ์šฐ
    • ์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ ๋ณต๊ตฌ๊ฐ€ ์–ด๋ ค์šด ๊ฒฝ์šฐ
    • ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ฝ”๋“œ๊ฐ€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ฐ€๋ฆฌ์ง€ ์•Š๊ฒŒ ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ
    • ์ฝ”๋“œ ๊ฐ„๊ฒฐ์„ฑ์ด ์ค‘์š”ํ•œ ๊ฒฝ์šฐ
    ๐Ÿ’ก ์ตœ๊ทผ Java ๊ฐœ๋ฐœ ํŠธ๋ Œ๋“œ๋Š” Unchecked Exception์„ ์„ ํ˜ธํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
    Spring Framework๋„ ์ฃผ๋กœ RuntimeException์„ ์ƒ์†ํ•œ ์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    ๐Ÿ™Œ ๋งˆ๋ฌด๋ฆฌ

    ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Java์—์„œ ์˜ˆ์™ธ๋ฅผ ์ง์ ‘ ๋‹ค๋ฃจ๊ณ  ์„ค๊ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค.

    throw์™€ throws ํ‚ค์›Œ๋“œ์˜ ์ฐจ์ด์ ์„ ์ดํ•ดํ•˜๊ณ , ์ƒํ™ฉ์— ๋งž๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ์˜ˆ์™ธ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค.

    ์˜ˆ์™ธ๋ฅผ ์ง์ ‘ ์„ค๊ณ„ํ•˜๊ณ  ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๋Šฅ๋ ฅ์€ ๋” ์•ˆ์ „ํ•˜๊ณ  ๋ช…ํ™•ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ํฐ ์ด์ ์ด ๋ฉ๋‹ˆ๋‹ค.

     

     

    Java ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ์„ ์ž˜ ํ™œ์šฉํ•˜๋ฉด ๋” ๊ฒฌ๊ณ ํ•˜๊ณ  ์‹ ๋ขฐ์„ฑ ์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋Š” ๋‹จ์ˆœํžˆ ์˜ค๋ฅ˜๋ฅผ ์žก๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ํ”„๋กœ๊ทธ๋žจ ํ๋ฆ„์„ ํšจ๊ณผ์ ์œผ๋กœ ์ œ์–ดํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

     

    ๋‹ค์Œ ๊ธ€์—์„œ๋Š” Java์˜ ์ฃผ์š” ํด๋ž˜์Šค ๋“ค์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

    ๊ถ๊ธˆํ•œ ๋‚ด์šฉ์ด๋‚˜ ์ถ”๊ฐ€๋กœ ์•Œ๊ณ  ์‹ถ์€ ๊ฐœ๋…์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์„ธ์š” ๐Ÿ˜Š

     

    ๋ฐ˜์‘ํ˜•