junghyunlyoo item 59 - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์žฅ์  1 :: ์ˆ˜๋งŽ์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์˜ ๊ฒฝํ—˜์ด ๋…น์•„์žˆ๋‹ค

๋‹ค์Œ์€ ๋ฌด์ž‘์œ„ ์ •์ˆ˜ ํ•˜๋‚˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค.

static Random rnd = new Random();

static int random(int n) {
    return Math.abs(rnd.nextInt()) % n;
}

์ด ์ฝ”๋“œ๋Š” ์„ธ ๊ฐ€์ง€ ๋ฌธ์ œ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

  1. n์ด ๊ทธ๋ฆฌ ํฌ์ง€ ์•Š์€ 2์˜ ์ œ๊ณฑ์ˆ˜๋ผ๋ฉด ์–ผ๋งˆ ์ง€๋‚˜์ง€ ์•Š์•„ ๊ฐ™์€ ์ˆ˜์—ด์ด ๋ฐ˜๋ณต๋œ๋‹ค.
  2. n์ด 2์˜ ์ œ๊ณฑ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๋ช‡๋ช‡ ์ˆซ์ž๊ฐ€ ํ‰๊ท ์ ์œผ๋กœ ๋” ์ž์ฃผ ๋ฐ˜ํ™˜๋œ๋‹ค.
  3. ์ง€์ •ํ•œ ๋ฒ”์œ„ ๋ฐ”๊นฅ์˜ ์ˆ˜๊ฐ€ ์ข…์ข… ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ ‡๊ฒŒ ์ง์ ‘ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋ฌธ์ œ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์„ ํ™•๋ฅ ์ด ํฌ๋‹ค.

์ง์ ‘ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ• ๋Œ€์‹  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ์ „ํ•˜๊ฒŒ ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

Random.nextInt(int)๋Š” ์œ„ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์œ ํ‹ธ์ด๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Šฅํ†ตํ•œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์„ค๊ณ„ํ•˜๊ณ  ๊ตฌํ˜„ํ–ˆ๊ณ , ์ด ๋ถ„์•ผ์˜ ์—ฌ๋Ÿฌ ์ „๋ฌธ๊ฐ€๊ฐ€ ์•ˆ์ „์„ฑ๊ณผ ์ •ํ™•์„ฑ์„ ๊ฒ€์ฆํ•ด์คฌ๋‹ค.

์ด๋ ‡๊ฒŒ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ทธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ์ „๋ฌธ๊ฐ€์˜ ์ง€์‹๊ณผ ์šฐ๋ฆฌ๋ณด๋‹ค ์•ž์„œ ์‚ฌ์šฉํ•œ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์˜ ๊ฒฝํ—˜์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ž๋ฐ” 7๋ถ€ํ„ฐ๋Š” Random์„ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๊ฒŒ ์ข‹๋‹ค. 
ThreadLocalRandom์ด๋ผ๋Š” ์„ฑ๋Šฅ์ด ๊ฐœ์„ ๋œ ์œ ํ‹ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค.

ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์žฅ์  2 :: ์‹œ๊ฐ„ ์ ˆ์•ฝ

ํ•ต์‹ฌ์ ์ธ ์„œ๋น„์Šค ๊ตฌํ˜„์— ํฌ๊ฒŒ ๊ด€๋ จ ์—†๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋А๋ผ ์‹œ๊ฐ„์„ ํ—ˆ๋น„ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์€ ํ•˜๋ถ€ ๊ณต์‚ฌ๋ฅผ ํ•˜๊ธฐ๋ณด๋‹ค๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์— ์ง‘์ค‘ํ•˜๊ณ  ์‹ถ์–ดํ•œ๋‹ค.

ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์žฅ์  3 :: ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ฑ๋Šฅ ๊ฐœ์„ 

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

์ž๋ฐ” ํ”Œ๋žซํผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋งŽ์€ ๋ถ€๋ถ„์ด ์ˆ˜ ๋…„์— ๊ฑธ์ณ ์ง€์†ํ•ด์„œ ๋‹ค์‹œ ์ž‘์„ฑ๋˜๋ฉฐ, ๋•Œ๋ก  ์„ฑ๋Šฅ์ด ๊ทน์ ์œผ๋กœ ๊ฐœ์„ ๋˜๊ธฐ๋„ ํ•œ๋‹ค.

ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์žฅ์  4 :: ์ ์  ๋งŽ์•„์ง€๋Š” ๊ธฐ๋Šฅ

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋ถ€์กฑํ•œ ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์ด์•ผ๊ธฐ๊ฐ€ ๋‚˜์˜ค๊ณ  ๋…ผ์˜๋œ ํ›„ ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค์— ํ•ด๋‹น ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜๊ณค ํ•œ๋‹ค.

ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์žฅ์  5 :: ๋ฒ”์šฉ์ ์ธ ์ฝ”๋“œ ์ž‘์„ฑ ๊ฐ€๋Šฅ

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋งŽ์€ ์‚ฌ๋žŒ์—๊ฒŒ ๋‚ฏ์ต์€ ์ฝ”๋“œ๊ฐ€ ๋œ๋‹ค. ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์ด ๋” ์ฝ๊ธฐ ์ข‹๊ณ , ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์ข‹๊ณ , ์žฌํ™œ์šฉํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๊ฐ€ ๋œ๋‹ค.

๊ทธ๋Ÿฌ๋‹ˆ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ž!

๋งŽ์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์€ ์ข‹์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๋Š”์ง€ ์ž˜ ๋ชฐ๋ผ์„œ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์„œ ์“ฐ๊ณค ํ•œ๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์Šต๊ด€์„ ๊ธฐ๋ฅด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ˆ˜๋งŽ์€ ๊ธฐ๋Šฅ๋“ค์„ ์„ค๋ช…ํ•ด๋†“์€ ๊ฒƒ์ด ๊ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ฉ”์ด์ € ๋ฆด๋ฆฌ์ฆˆ์ด๋‹ค.

์ด ๋ฉ”์ด์ € ๋ฆด๋ฆฌ์ฆˆ๋ฅผ ์ฝ์œผ๋ฉด ์ข‹๋‹ค. ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์žฅ์ ์„ ํ™•์ธํ•ด๋ณด์ž.

public static void main(String[] args) throws IOException {
    try (InputStream in = new URL(args[0]).openStream()) {
        in.transferTo(System.out);
    }
}

์˜ˆ์ „์—๋Š” ์ž‘์„ฑํ•˜๊ธฐ๊ฐ€ ๊นŒ๋‹ค๋กœ์šด ๊ธฐ๋Šฅ์ด์—ˆ์ง€๋งŒ, ์ž๋ฐ” 9์—์„œ InputStream์— ์ถ”๊ฐ€๋œ transferTo ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.


๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋„ˆ๋ฌด ๋ฐฉ๋Œ€ํ•˜์—ฌ ๋ชจ๋“  API ๋ฌธ์„œ๋ฅผ ๊ณต๋ถ€ํ•˜๊ธฐ๋Š” ๋ฒ…์ฐจ๊ฒ ์ง€๋งŒ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ผ๋ฉด ์ ์–ด๋„ java.lang, java.util, java.io์™€ ๊ทธ ํ•˜์œ„ ํŒจํ‚ค์ง€๋“ค์—๋Š” ์ต์ˆ™ํ•ด์ ธ์•ผ ํ•œ๋‹ค.

๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์€ ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ์ตํ˜€์•ผ ํ•œ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋งค๋…„ ์•„์ฃผ ๋น ๋ฅด๊ฒŒ ์„ฑ์žฅํ•˜๊ณ  ์žˆ์œผ๋‹ˆ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์š”์•ฝํ•˜๋Š” ๊ฑด ๋ฌด๋ฆฌ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ์–ธ๊ธ‰ํ•ด๋‘˜ ๋งŒํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๋‹ค. ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ์ŠคํŠธ๋ฆผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค.

java.util.concurrent์˜ ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์•Œ์•„๋‘๋ฉด ํฐ ๋„์›€์ด ๋œ๋‹ค.

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

(java.util.concurrent์˜ ๊ณ ์ˆ˜์ค€ ๊ฐœ๋…์€ item 80๊ณผ item 81์—์„œ ๋‹ค๋ฃฌ๋‹ค)


๋•Œ๋•Œ๋กœ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ถฉ๋ถ„ํžˆ ์ œ๊ณตํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ๋‹ค. ๋” ์ „๋ฌธ์ ์ธ ๊ธฐ๋Šฅ์„ ์š”๊ตฌํ• ์ˆ˜๋ก ์ด๋Ÿฐ ์ƒํ™ฉ์ด ๋” ์ž์ฃผ ์ƒ๊ธธ ๊ฒƒ์ด๋‹ค.

์šฐ์„ ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค ์‹œ๋„ํ•ด๋ณด์ž. ์–ด๋–ค ์˜์—ญ์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ณ , ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์•„๋‹ˆ๋ผ ํŒ๋‹จ๋˜๋ฉด ๋Œ€์•ˆ์„ ์‚ฌ์šฉํ•˜์ž.

์–ด๋–ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“  ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์€ ์œ ํ•œํ•˜๋ฏ€๋กœ ํ•ญ์ƒ ๋นˆ ๊ตฌ๋ฉ์ด ์žˆ๊ธฐ ๋งˆ๋ จ์ด๋‹ค.

์ž๋ฐ” ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด, ๊ทธ๋‹ค์Œ ์„ ํƒ์ง€๋Š” ๊ณ ํ’ˆ์งˆ์˜ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.

๊ตฌ๊ธ€์˜ ๋ฉ‹์ง„ ๊ตฌ์•„๋ฐ” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋Œ€ํ‘œ์ ์ด๋‹ค. ์ ํ•ฉํ•œ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ์ฐพ์ง€ ๋ชปํ–ˆ๋‹ค๋ฉด, ๋‹ค๋ฅธ ์„ ํƒ์ด ์—†์œผ๋‹ˆ ์ง์ ‘ ๊ตฌํ˜„ํ•˜์ž.