item 71 JungHyunLyoo - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

๊ฒ€์‚ฌ ์˜ˆ์™ธ์˜ ๋ถˆํŽธํ•จ

๊ฒ€์‚ฌ ์˜ˆ์™ธ๋ฅผ ์‹ซ์–ดํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งŽ์ง€๋งŒ ์ œ๋Œ€๋กœ ํ™œ์šฉํ•˜๋ฉด API์™€ ํ”„๋กœ๊ทธ๋žจ์˜ ์งˆ์„

๋†’์ผ ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜๋ฉด ์‚ฌ์šฉ์ด ๊ณผํ•ด์ง€๋ฉด ๋ถˆํŽธํ•˜๊ธฐ๋งŒ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

(๊ฒ€์‚ฌ ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๋Š” ๋ฉ”์„œ๋“œ๋Š” ์ŠคํŠธ๋ฆผ ์•ˆ์—์„œ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— (item45 ~ 48)

์ž๋ฐ” 8๋ถ€ํ„ฐ๋Š” ๋ถ€๋‹ด์ด ๋”์šฑ ์ปค์กŒ๋‹ค)

๊ฒ€์‚ฌ ์˜ˆ์™ธ๊ฐ€ ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ์ง€์šฐ๋Š” ๋ถ€๋‹ด์€ ๋ฉ”์„œ๋“œ๊ฐ€ ๋‹จ ํ•˜๋‚˜์˜ ๊ฒ€์‚ฌ ์˜ˆ์™ธ๋งŒ

๋˜์งˆ ๋•Œ๊ฐ€ ํŠนํžˆ ํฌ๋‹ค. API ์•ˆ์— ๊ฒ€์‚ฌ ์˜ˆ์™ธ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ ์žˆ์„ ๋•Œ๋‚˜, ํ•˜๋‚˜๋งŒ ์žˆ์„ ๋•Œ๋‚˜

์–ด์ฐจํ”ผ try catch๋กœ ๋ฌถ๊ฑฐ๋‚˜ throws๋กœ ๋˜์ ธ์ค˜์•ผ ํ•˜๋Š”๊ฑด ๋˜‘๊ฐ™๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด์ฒ˜๋Ÿผ ๊ฒ€์‚ฌ ์˜ˆ์™ธ์— ๋Œ€ํ•œ ์ฑ…์ž„์„ ์ง€๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ์ŠคํŠธ๋ฆผ์—์„œ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

๊ฒ€์‚ฌ ์˜ˆ์™ธ๊ฐ€ 0๊ฐœ์—์„œ 1๊ฐœ๊ฐ€ ๋˜๋Š” ๊ฒƒ์€ 99๊ฐœ์—์„œ 100๊ฐœ๊ฐ€ ๋˜๋Š”๊ฒƒ์— ๋น„ํ•ด ํ›จ์”ฌ ํฐ ๋ถ€๋‹ด์ด๋‹ค.

๊ฒ€์‚ฌ ์˜ˆ์™ธ ํšŒํ”ผ ๋ฐฉ๋ฒ• :: 1. ๋น„๊ฒ€์‚ฌ ์˜ˆ์™ธ

API๋ฅผ ์ œ๋Œ€๋กœ ์‚ฌ์šฉํ•ด๋„ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์™ธ์ด๊ฑฐ๋‚˜, ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์˜๋ฏธ ์žˆ๋Š” ์กฐ์น˜๋ฅผ

์ทจํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด ์ด ์ •๋„ ๋ถ€๋‹ด์ฏค์€ ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

ํ•˜์ง€๋งŒ ์ด ๊ฒฝ์šฐ๋“ค์ด ์•„๋‹ˆ๋ผ๋ฉด, ๋น„๊ฒ€์‚ฌ ์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. (item70)

์•„๋ž˜ ๋‘ ์ฝ”๋“œ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ(API ์‚ฌ์šฉ์ž)๊ฐ€ ๊ฒ€์‚ฌ ์˜ˆ์™ธ๋ฅผ ์ฑ…์ž„์ง€๋Š” ์‚ฌ๋ก€๋‹ค.

} catch (TheCheckedException e) { 
    throw new AssertionError();  

}

} catch (TheCheckedException e) {
    e.printStackTrace();
    System.exit(1);
}

์ฒซ ๋ฒˆ์งธ ์ฝ”๋“œ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋น„๊ฒ€์‚ฌ ์˜ˆ์™ธ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ•ด๊ฒฐํ–ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ์ฝ”๋“œ๋Š” ์—๋Ÿฌ ์Šคํƒ ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์‹œ์Šคํ…œ์„ ์ข…๋ฃŒ์‹œํ‚จ๋‹ค.

๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ์• ์ดˆ์— ๋น„๊ฒ€์‚ฌ ์˜ˆ์™ธ๋กœ API๋ฅผ ๋งŒ๋“ค๋ฉด ๋์„ ๊ฒƒ์ด๋‹ค.

๊ฒ€์‚ฌ ์˜ˆ์™ธ ํšŒํ”ผ ๋ฐฉ๋ฒ• :: 2. Optional

๊ฒ€์‚ฌ ์˜ˆ์™ธ๋ฅผ ํšŒํ”ผํ•˜๋Š” ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ ์ ์ ˆํ•œ ๊ฒฐ๊ณผ ํƒ€์ž…์„ ๋‹ด์€ ์˜ต์…”๋„์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. (item55)

๊ฒ€์‚ฌ ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๋Š” ๋Œ€์‹  ๋‹จ์ˆœํžˆ ๋นˆ ์˜ต์…”๋„์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋œ๋‹ค. ์‰ฝ๋‹ค.

ํ•˜์ง€๋งŒ ์ด ๋ฐฉ์‹์€ ๋‹จ์ ์ด ์žˆ๋‹ค. ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ ์ด์œ ๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ๋ถ€๊ฐ€ ์ •๋ณด๋ฅผ ๋‹ด์„ ์ˆ˜ ์—†๋‹ค๋Š” ์ ์ด๋‹ค.

(์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ตฌ์ฒด์ ์ธ ์˜ˆ์™ธ ํƒ€์ž…๊ณผ ๊ทธ ํƒ€์ž…์ด ์ œ๊ณตํ•˜๋Š” ๋ฉ”์„œ๋“œ๋“ค์„ ํ™œ์šฉํ•ด ๋ถ€๊ฐ€ ์ •๋ณด๋ฅผ

์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.(item70))

๊ฒ€์‚ฌ ์˜ˆ์™ธ ํšŒํ”ผ ๋ฐฉ๋ฒ• :: 3. ๋ฉ”์„œ๋“œ ์ชผ๊ฐœ๊ธฐ

๊ฒ€์‚ฌ ์˜ˆ์™ธ๋ฅผ ํšŒํ”ผํ•˜๋Š” ์„ธ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ ๊ฒ€์‚ฌ ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๋Š” ๋ฉ”์„œ๋“œ๋ฅผ 2๊ฐœ๋กœ ์ชผ๊ฐœ์–ด ๋น„๊ฒ€์‚ฌ ์˜ˆ์™ธ๋กœ

๋ฐ”๊พธ๋Š” ๊ฒƒ์ด๋‹ค. ์ชผ๊ฐœ์ง„ ์ฒซ ๋ฒˆ์งธ ๋ฉ”์„œ๋“œ๋Š” ์˜ˆ์™ธ๊ฐ€ ๋˜์ ธ์งˆ์ง€ ์—ฌ๋ถ€๋ฅผ boolean๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

<๋ฉ”์„œ๋“œ ์ชผ๊ฐœ๊ธฐ before>

try {
    Obj.action(args);    
} catch (TheCheckedException e) {
    //do something
}

<๋ฉ”์„œ๋“œ ์ชผ๊ฐœ๊ธฐ after>

if (obj.actionPermitted(args)) {
    obj.action(args);
} else {
    //do something
}

action ๋‚ด์˜ ๋กœ์ง์„ 2๊ฐœ ๋งค์†Œ๋“œ (actionPermitted, action) ์œผ๋กœ ๋‚˜๋ˆˆ ๋ชจ์Šต์ด๋‹ค.

๊น”๋”ํ•จ์„ ์–ด๋Š์ •๋„ ํฌ๊ธฐํ•˜๊ณ  ์œ ์—ฐํ•จ์„ ์–ป์—ˆ๋‹ค.


ํ•œํŽธ, actionPermitted๋Š” '์ƒํƒœ ๊ฒ€์‚ฌ ๋ฉ”์„œ๋“œ'์— ํ•ด๋‹นํ•˜๋ฏ€๋กœ ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ผ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

์™ธ๋ถ€ ๋™๊ธฐํ™” ์—†์ด ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฑฐ๋‚˜ ์™ธ๋ถ€ ์š”์ธ์— ์˜ํ•ด ์ƒํƒœ๊ฐ€

๋ณ€ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ด ๋ฆฌํŒฉํ„ฐ๋ง์€ ์ ์ ˆํ•˜์ง€ ์•Š๋‹ค. (item69)

actionPermitted์™€ action ํ˜ธ์ถœ ์‚ฌ์ด์— ๊ฐ์ฒด์˜ ์ƒํƒœ๊ฐ€ ๋ณ€ํ•  ์ˆ˜ ์žˆ๊ณ ,

๋˜ ๋‘ ๋ฉ”์„œ๋“œ๊ฐ€ ๋™์ผํ•œ ๋กœ์ง์„ ์ค‘๋ณตํ•ด์„œ ๊ฐ€์ง€๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ฒฐ๋ก 

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

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

๋ณต๊ตฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ณ  ํ˜ธ์ถœ์ž๊ฐ€ ๊ทธ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๊ธธ ๋ฐ”๋ž€๋‹ค๋ฉด, ์˜ต์…”๋„ ์‚ฌ์šฉ์„ ๊ฒ€ํ† ํ•ด๋ณด์ž.

๊ทธ๋ž˜๋„ ์—ฌ์˜์น˜ ์•Š์œผ๋ฉด ๊ทธ๋•Œ์„œ์•ผ ๊ฒ€์‚ฌ ์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•˜์ž.

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