item 75 SeungminLee - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

Effective Java 3e item 75 ์˜ˆ์™ธ์˜ ์ƒ์„ธ ๋ฉ”์‹œ์ง€์— ์‹คํŒจ ๊ด€๋ จ ์ •๋ณด๋ฅผ ๋‹ด์œผ๋ผ๋ฅผ ์š”์•ฝํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

์˜ˆ์™ธ๋ฅผ ์žก์ง€ ๋ชปํ•ด ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํŒจํ•˜๋ฉด ์ž๋ฐ” ์‹œ์Šคํ…œ์€ ๊ทธ ์˜ˆ์™ธ์˜ ์Šคํƒ์ถ”์ Stack Trace ์ •๋ณด๋ฅผ ์ž๋™์œผ๋กœ ์ถœ๋ ฅํ•œ๋‹ค. ์Šคํƒ์ถ”์ ์€ ์˜ˆ์™ธ ๊ฐ์ฒด์˜ toString ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด ์–ป๋Š” ๋ฌธ์ž์—ด๋กœ ์˜ˆ์™ธ์˜ ํด๋ž˜์Šค ์ด๋ฆ„ ๋’ค์— ์ƒ์„ธ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ถ™๋Š” ํ˜•ํƒœ์ด๋‹ค. ์ด ์ •๋ณด๊ฐ€ ์‹คํŒจ์›์ธ์„ ๋ถ„์„ํ•ด์•ผ ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ์ •๋ณด์ธ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ๋”ฐ๋ผ์„œ ์˜ˆ์™ธ์˜ toString ๋ฉ”์„œ๋“œ์— ์‹คํŒจ ์›์ธ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€๋Šฅํ•œ ๋งŽ์ด ๋‹ด์•„ ๋ฐ˜ํ˜ธ๋‚˜ํ•˜๋Š” ์ผ์€ ์•„์ฃผ ์ค‘์š”ํ•˜๋‹ค. ๋‹ฌ๋ฆฌ ๋งํ•˜๋ฉด, ์‚ฌํ›„ ๋ถ„์„์„ ์œ„ํ•ด ์‹คํŒจ ์ˆœ๊ฐ„์˜ ์ƒํ™ฉ์„ ์ •ํ™•ํžˆ ํฌ์ฐฉํ•ด ์˜ˆ์™ธ์˜ ์ƒ์„ธ ๋ฉ”์‹œ์ง€์— ๋‹ด์•„์•ผ ํ•œ๋‹ค.

์‹คํŒจ ์ˆœ๊ฐ„์„ ํฌ์ฐฉํ•˜๋ ค๋ฉด ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ์— ๊ด€์—ฌ๋œ ๋ชจ๋“  ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ํ•„๋“œ์˜ ๊ฐ’์„ ์‹คํŒจ ๋ฉ”์‹œ์ง€์— ๋‹ด์•„์•ผ ํ•œ๋‹ค.

  1. ์˜ˆ๋ฅผ ๋“ค์–ด IndexOuOfBoundsException์˜ ์ƒ์„ธ ๋ฉ”์‹œ์ง€๋Š” ๋ฒ”์œ„์˜ ์ตœ์†Ÿ๊ฐ’๊ณผ ์ตœ๋Œ“๊ฐ’, ๊ทธ๋ฆฌ๊ณ  ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฌ๋‹ค๋Š” ์ธ๋ฑ์Šค ๊ฐ’ ๋“ฑ์˜ ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ๋‹ด์•„์•ผ ํ•œ๋‹ค. ์ด๋“ค์€ ๋ชจ๋‘ ๋‹ค๋ฅธ ์˜ˆ์™ธ ์ƒํ™ฉ๋“ค์˜ ์›์ธ์ด ๋˜๋ฏ€๋กœ, ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋ฉด ๋ฌด์—‡์„ ๊ณ ์ณ์•ผ ํ• ์ง€ ๋ถ„์„ํ•˜๋Š”๋ฐ ํฐ ๋„์›€์ด ๋œ๋‹ค.

๋ณด์•ˆ๊ณผ ๊ด€๋ จํ•œ ์ •๋ณด๋Š” ์ฃผ์˜ํ•ด์„œ ๋‹ค๋ค„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์Šคํƒ ์ถ”์ ์˜ ์ƒ์„ธ ๋ฉ”์‹œ์ง€์— ๋น„๋ฐ€๋ฒˆํ˜ธ๋‚˜ ์•”ํ˜ธ ํ‚ค ๊ฐ™์€ ์ •๋ณด๊นŒ์ง€ ๋‹ด์•„์„œ๋Š” ์•ˆ๋œ๋‹ค.

  1. ๊ด€๋ จ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ๋‹ด์•„์•ผ ํ•˜์ง€๋งŒ ์žฅํ™ฉํ•  ํ•„์š” ์—†๋‹ค. ๋ฌธ์ œ๋ฅผ ๋ถ„์„ํ•˜๋Š” ์‚ฌ๋žŒ์€ ์Šคํƒ ์ถ”์ ๋ฟ ์•„๋‹ˆ๋ผ ๊ด€๋ จ ๋ฌธ์„œ์™€ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ํ•จ๊ป˜ ์‚ดํŽด๋ณด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์Šคํƒ ์ถ”์ ์—๋Š” ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ ๋ฉ”์„œ๋“œ๋“ค์˜ ํŒŒ์ผ ์ด๋ฆ„๊ณผ ์ค„๋ฒˆํ˜ธ๊นŒ์ง€ ์ •ํ™•ํžˆ ๊ธฐ๋ก๋˜์–ด ์žˆ๋‹ค.

  1. ์˜ˆ์™ธ์˜ ์ƒ์„ธ ๋ฉ”์‹œ์ง€์™€ ์ตœ์ข… ์‚ฌ์šฉ์ž์—์„ธ ๋ณด์—ฌ์ค„ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ํ˜ผ๋™ํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค.

์ตœ์ข… ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ์นœ์ ˆํ•œ ์•ˆ๋‚ด ๋ฉ”์‹œ์ง€๋Š” ๋ณด์—ฌ์ค˜์•ผ ํ•˜๋Š” ๋ฐ˜๋ฉด, ์˜ˆ์™ธ ๋ฉ”์‹œ์ง€๋Š” ๊ฐ€๋…์„ฑ๋ณด๋‹ค๋Š” ๋‹ด๊ธด ๋‚ด์šฉ์ด ํ›จ์”ฌ ์ค‘์š”ํ•˜๋‹ค.

์˜ˆ์™ธ ๋ฉ”์‹œ์ง€์˜ ์ฃผ ์†Œ๋น„์ธต์€ ๋ฌธ์ œ๋ฅผ ๋ถ„์„ํ•  ํ”„๋กœ๊ทธ๋ž˜๋จธ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋˜ํ•œ ์ตœ์ข… ์‚ฌ์šฉ์ž์šฉ ๋ฉ”์‹œ์ง€๋Š” ํ˜„์ง€์–ด๋กœ ๋ฒˆ์—ญํ•ด์ฃผ๊ธฐ๋„ ํ•˜์ง€๋งŒ, ์˜ˆ์™ธ ๋ฉ”์‹œ์ง€๋Š” ๊ทธ๋Ÿฐ ์ผ์ด ๊ฑฐ์˜ ์—†๋‹ค.

  1. ์‹คํŒจ๋ฅผ ์ ์ ˆํžˆ ํฌ์ฐฉํ•˜๋ ค๋ฉด ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์˜ˆ์™ธ ์ƒ์„ฑ์ž์—์„œ ๋ชจ๋‘ ๋ฐ›์•„์„œ ์ƒ์„ธ ๋ฉ”์‹œ์ง€๊นŒ์ง€ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด ๋†“๋Š” ๋ฐฉ๋ฒ•๋„ ๊ดœ์ฐฎ๋‹ค.
    /**
         * IndexOutOfBoundsException์„ ์ƒ์„ฑํ•œ๋‹ค
         * @param lowerBound ์ธ๋ฑ์Šค์˜ ์ตœ์†Ÿ๊ฐ’
         * @param upperBound ์ธ๋ฑ์Šค์˜ ์ตœ๋Œ“๊ฐ’ + 1
         * @param index ์ธ๋ฑ์Šค์˜ ์‹ค์ ฏ๊ฐ’
         */
       public IndexOutOfBoundsException(int lowerBound, int upperBound, int index){
            // ์‹คํŒจ๋ฅผ ํฌ์ฐฉํ•˜๋Š” ์ƒ์„ธ ๋ฉ”์‹œ์ง€๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
           super(String.format("์ตœ์†Ÿ๊ฐ’: %d , ์ตœ๋Œ“๊ฐ’: %d, ์ธ๋ฑ์Šค: %d", lowerBound, upperBound, index));
           
           // ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์‹คํŒจ ์ •๋ณด๋ฅผ ์ €์žฅํ•ด๋‘”๋‹ค.
           this.lowerBound = lowerBound;
           this.upperBound = upperBound;
           this.index = index;
    }
 

Java9 ์—์„œ๋Š” IndexOutOfBoundsException์— ๋“œ๋””์–ด ์ •์ˆ˜ ์ธ๋ฑ์Šค ๊ฐ’์„ ๋ฐ›๋Š” ์ƒ์„ฑ์ž๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ์•„์‰ฝ๊ฒŒ๋„ ์ตœ์†Ÿ๊ฐ’๊ณผ ์ตœ๋Œ“๊ฐ’๊นŒ์ง€ ๋ฐ›์ง€๋Š” ์•Š๋Š”๋‹ค. ์ž๋ฐ” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ด ์กฐ์–ธ์„ ์ ๊ทน ์ˆ˜์šฉํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ๋‚˜๋Š” ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅํ•˜๋Š” ๋ฐ”์ด๋‹ค. ์ด๋ ‡๊ฒŒ ํ•ด๋‘๋ฉด ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋˜์ง€๋Š” ์˜ˆ์™ธ๋Š” ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์‹คํŒจ๋ฅผ ๋” ์ž˜ ํฌ์ฐฉํ•œ๋‹ค.

๋˜ํ•œ ๊ณ ํ’ˆ์งˆ์˜ ์ƒ์„ธ ๋ฉ”์‹œ์ง€๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ์ฝ”๋“œ๋ฅผ ์˜ˆ์™ธ ํด๋ž˜์Šค ์•ˆ์œผ๋กœ ๋ชจ์•„์ฃผ๋Š” ํšจ๊ณผ๋„ ์žˆ์–ด, ํด๋ž˜์Šค ์‚ฌ์šฉ์ž๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ๋งŒ๋“œ๋Š” ์ž‘์—…์„ ์ค‘๋ณตํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

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

โš ๏ธ **GitHub.com Fallback** โš ๏ธ