Item 69. Exceptional Conditions

์˜ˆ์™ธ๋Š” ์ง„์งœ ์˜ˆ์™ธ ์ƒํ™ฉ์—๋งŒ ์‚ฌ์šฉํ•˜๋ผ

์ œ์–ด ํ๋ฆ„์—์„œ์˜ ์˜ˆ์™ธ

๋ฐ˜๋ณต๋ฌธ์„ ์ˆœํšŒ ํ•  ๋•Œ ์•„๋ž˜์™€ ๊ฐ™์ด ์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฃจํ”„๋ฅผ ์ข…๋ฃŒํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์กด์žฌํ•  ๊ฒƒ์ด๋‹ค. JVM์€ ๋ฐฐ์—ด์— ์ ‘๊ทผํ•  ๋•Œ๋งˆ๋‹ค ๊ฒฝ๊ณ„๋ฅผ ๋„˜์ง€ ์•Š๋Š”์ง€ ๊ฒ€์‚ฌ๋ฅผ ํ•˜๋Š”๋ฐ, 1๋ฒˆ์—์„œ๋Š” ์ค‘๋ณต๋  ์ˆ˜ ์žˆ๋Š” ๋ฐฐ์—ด์˜ ๊ฒฝ๊ณ„๋ฅผ ๋„˜์ง€ ์•Š๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๋Š” ๋ถ€๋ถ„(i < range.length)์„ ์ œ๊ฑฐํ–ˆ๋‹ค. ๋•Œ๋ฌธ์— 1๋ฒˆ ๋ฐฉ๋ฒ•์ด ๋ฃจํ”„๋ฅผ ๋” ๋น ๋ฅด๊ฒŒ ๋Œ๋ฆด ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” 2๋ฒˆ์˜ ๋ฐฉ๋ฒ•์ด ๋” ๋น ๋ฅด๋‹ค.(์•ฝ 2๋ฐฐ ์ฐจ์ด)

class Test {

    public static void main(String[] args) {
        Mountain[] range = new Mountain[100000000];
        for (int i = 0; i < range.length; i++) {
            range[i] = new Mountain();
        }

        // 1. ์˜ˆ์™ธ๋ฅผ ์จ์„œ ๋ฃจํ”„ ์ข…๋ฃŒ
        long start = System.currentTimeMillis();
        try {
            int i = 0;
            while (true) {
                range[i++].climb();
            }
        } catch (ArrayIndexOutOfBoundsException e) {
            // ignore
        }
        long end = System.currentTimeMillis();
        System.out.println("์‹คํ–‰ ์‹œ๊ฐ„ : " + (end - start) / 1000.0 + "์ดˆ");

        // 2. for-each ๋ฌธ ์‚ฌ์šฉ
        start = System.currentTimeMillis();
        for (Mountain mountain : range) {
            mountain.climb();
        }
        end = System.currentTimeMillis();
        System.out.println("์‹คํ–‰ ์‹œ๊ฐ„ : " + (end - start) / 1000.0 + "์ดˆ");
    }

    static class Mountain {

        public void climb() {
        }
    }
}

๋˜ํ•œ ๊ฑฐ์˜ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์ด ์ง๊ด€์ ์ด์ง€ ์•Š๋‹ค๋Š” ์ด์œ ๋กœ 2๋ฒˆ์˜ ๋ฐฉ๋ฒ•์„ ์„ ํ˜ธํ•  ๊ฒƒ์ด์ง€๋งŒ, ๊ทธ ์ด์™ธ์—๋„ ๋งŽ์€ ์ด์œ ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

  1. ์˜ˆ์™ธ๋Š” ์˜ˆ์™ธ ์ƒํ™ฉ์„ ๋ชฉ์ ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ตœ์ ํ™”๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค.(๋А๋ฆฐ ์†๋„)

  2. try-catch ๋ธ”๋ก์ด ์ƒ๊ธฐ๋ฉด JVM์ด ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์ ํ™”๊ฐ€ ์ œํ•œ๋œ๋‹ค.

  3. ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋Š” ํ‘œ์ค€ ๊ด€์šฉ๊ตฌ์—๋Š” ์ด๋ฏธ ์ตœ์ ํ™” ์ฒ˜๋ฆฌ ๋˜์–ด ๋ฐฐ์—ด ๋ฒ”์œ„์— ๋Œ€ํ•œ ์ค‘๋ณต ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค.

์„ฑ๋Šฅ์ ์ธ ์ธก๋ฉด ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์•„๋ž˜์™€ ๊ฐ™์€ ์‹œ๋‚˜๋ฆฌ์˜ค๋กœ ์ธํ•ด ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค.

  1. ๋ฐ˜๋ณต๋ฌธ ์•ˆ์— ๋ฒ„๊ทธ๊ฐ€ ์กด์žฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •

  2. ํ๋ฆ„ ์ œ์–ด์— ์‚ฌ์šฉ๋œ ์˜ˆ์™ธ๊ฐ€ ํ•ด๋‹น ๋ฒ„๊ทธ๋ฅผ ์ˆจ๊น€

  3. ๋ฐ˜๋ณต๋ฌธ์—์„œ ํ˜ธ์ถœํ•œ ๋ฉ”์„œ๋“œ๊ฐ€ ๊ด€๋ จ ์—†๋Š” ๋ฐฐ์—ด์„ ์‚ฌ์šฉ ์ค‘์— ArrayIndexOutOfBoundsException์„ ๋˜์ง

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

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

์ƒํƒœ ๊ฒ€์‚ฌ๋ฅผ ํ†ตํ•œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ตœ์†Œํ™”

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

Iterator ์ธํ„ฐํŽ˜์ด์Šค์˜ next() ๋ฉ”์„œ๋“œ๋Š” ๋‹ค์Œ ์š”์†Œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์„ ๋•Œ NoSuchElementException์„ ๋˜์ง€๋Š”๋ฐ, ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— hasNext() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋‹ค์Œ ์š”์†Œ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋ฉด ์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ์ƒํƒœ ๊ฒ€์‚ฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ƒํƒœ ๊ฒ€์‚ฌ ๋ฉ”์„œ๋“œ vs Optional vs ํŠน์ • ๊ฐ’

์ƒํƒœ ๊ฒ€์‚ฌ ๋ฉ”์„œ๋“œ ๋Œ€์‹  Optional์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ null ๊ฐ™์€ ํŠน์ˆ˜ํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์กด์žฌํ•˜๋Š”๋ฐ, ์…‹ ์ค‘ ์„ ํƒํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ง€์นจ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  1. Optional / ํŠน์ • ๊ฐ’

    • ์™ธ๋ถ€ ๋™๊ธฐํ™” ์—†์ด ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ์™ธ๋ถ€ ์š”์ธ์œผ๋กœ ๋ณ€ํ•˜๋Š” ๊ฒฝ์šฐ: ์ƒํƒœ ๊ฒ€์‚ฌ ๋ฉ”์„œ๋“œ์™€ ์ƒํƒœ ์˜์กด์  ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‚ฌ์ด์— ๊ฐ์ฒด ์ƒํƒœ๊ฐ€ ๋ณ€ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Optional / ํŠน์ • ๊ฐ’์ด ์ ํ•ฉํ•˜๋‹ค.

    • ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ์ƒํ™ฉ: ์ƒํƒœ ๊ฒ€์‚ฌ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค Optional / ํŠน์ • ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๋น ๋ฅด๋‹ค.

  2. ์ƒํƒœ ๊ฒ€์‚ฌ ๋ฉ”์„œ๋“œ

    • ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒฝ์šฐ: ๊ฐ€๋…์„ฑ์ด ์‚ด์ง ๋” ์ข‹๊ณ , ์ž˜๋ชป ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ๋””๋ฒ„๊น…์ด ๋” ์‰ฝ๋‹ค.

Last updated